예제 #1
0
        //----------------------------------------------------------------------------
        public void Read_IR_TypeOfDevice(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error, Byte addressSlave, out TYPE_NGK_DEVICE typeOfDevice)
        {
            Modbus.OSIModel.Message.Result result;
            UInt16[] registers;

            if (host == null)
            {
                typeOfDevice = TYPE_NGK_DEVICE.UNKNOWN_DEVICE;
                error = new OperationResult(OPERATION_RESULT.CONNECTION_ERROR, 
                    "Подключение к сети не создано");
            }
            else
            {
                if (host.DataLinkObject.IsOpen())
                {
                    result = host.ReadInputRegisters(addressSlave,
                        BI_ADDRESSES_OF_INPUTREGISTERS.TypeOfDevice,
                        1, out registers);

                    if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
                    {
                        try
                        {
                            typeOfDevice =
                                (TYPE_NGK_DEVICE)Enum.Parse(typeof(TYPE_NGK_DEVICE),
                                registers[0].ToString());
                            error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                        }
                        catch
                        {
                            typeOfDevice = TYPE_NGK_DEVICE.UNKNOWN_DEVICE;
                            error = new OperationResult(OPERATION_RESULT.UNKNOWN_DEVICE, 
                                String.Format(
                                "Устройство вернуло код неизвестного типа устройства: {0}", registers[0].ToString()));
                        }
                    }
                    else
                    {
                        typeOfDevice = TYPE_NGK_DEVICE.UNKNOWN_DEVICE;
                        error = new OperationResult(OPERATION_RESULT.FAILURE, 
                            result.Description);
                    }
                }
                else
                {
                    typeOfDevice = TYPE_NGK_DEVICE.UNKNOWN_DEVICE;
                    error = new OperationResult(OPERATION_RESULT.CONNECTION_ERROR, 
                        "Соeдинение создано, но не открыто");
                }
            }
            return;
        }
예제 #2
0
 //----------------------------------------------------------------------------
 public void Write_HR_MeasuringVoltagePeriod(
     ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
     out OperationResult error)
 {
     //throw new InvalidOperationException("Операция не применима к версии БИ(У)-01");
     error = new OperationResult(OPERATION_RESULT.INVALID_OPERATION,
         "Операция не применима к версии БИ(У)-01");
 }
예제 #3
0
        //----------------------------------------------------------------------------
        public void Read_IR_InternalTemperatureSensor(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            //throw new InvalidOperationException("Операция неподдреживается в БИ(У)-00");
            error = new OperationResult(OPERATION_RESULT.INVALID_OPERATION, 
                "Операция неподдреживается в БИ(У)-00");

            //Modbus.OSIModel.Message.Result result;
            ////String msg;
            //UInt16[] registers;

            //result = host.ReadInputRegisters(_AddressSlave,
            //    BI_ADDRESSES_OF_INPUTREGISTERS.InternalTemperatureSensor,
            //    1, out registers);

            //if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            //{
            //    this.InternalTemperatureSensor =
            //        (Int16)(ToValue(registers[0]));
            //    error = new OperationResult(true, String.Empty);
            //}
            //else
            //{
            //    error = new OperationResult(false, result.Description);
            //}
            return;
        }
예제 #4
0
        //----------------------------------------------------------------------------
        public void Read_IR_SerialNumber(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            Modbus.OSIModel.Message.Result result;
            //String msg;
            UInt16[] registers;

            result = host.ReadInputRegisters(AddressSlave,
                BI_ADDRESSES_OF_INPUTREGISTERS.SerialNumber,
                3, out registers);

            if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                UInt64 serialNumber;
                serialNumber = 0;
                serialNumber = registers[0]; // Upper
                serialNumber |= (serialNumber << 16);
                serialNumber |= registers[1]; // High
                serialNumber |= (serialNumber << 16);
                serialNumber |= registers[2]; // Low

                this.SerialNumber = serialNumber;

                error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
            }
            else
            {
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
            return;
        }
예제 #5
0
        //----------------------------------------------------------------------------
        public void Read_IR_TypeOfDevice(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error, out TYPE_NGK_DEVICE typeOfDevice)
        {
            Modbus.OSIModel.Message.Result result;
            //String msg;
            UInt16[] registers;

            result = host.ReadInputRegisters(AddressSlave,
                BI_ADDRESSES_OF_INPUTREGISTERS.TypeOfDevice,
                1, out registers);

            if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                try
                {
                    typeOfDevice =
                        (TYPE_NGK_DEVICE)Enum.Parse(typeof(TYPE_NGK_DEVICE),
                        registers[0].ToString());
                    
                    error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                }
                catch
                {
                    typeOfDevice = TYPE_NGK_DEVICE.UNKNOWN_DEVICE;
                    error = new OperationResult(OPERATION_RESULT.UNKNOWN_DEVICE, String.Format(
                        "Устройство вернуло код неизвестного типа устройства: {0}", registers[0].ToString()));
                }
            }
            else
            {
                typeOfDevice = TYPE_NGK_DEVICE.UNKNOWN_DEVICE;
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
            return;
        }
예제 #6
0
        //----------------------------------------------------------------------------
        public void Write_CL_AcCurrentRefereceElectrodeEn(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            Modbus.OSIModel.Message.Result result;
            String msg;
            Modbus.State coil;

            coil = Modbus.Convert.ToState(this.AcCurrentRefereceElectrodeEn);

            result = host.WriteSingleCoil(_AddressSlave,
                BI_ADDRESSES_OF_COILS.AcCurrentRefereceElectrodeEn, ref coil);

            if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                // Проверяем записанные данные
                if (this.AcCurrentRefereceElectrodeEn !=
                    Modbus.Convert.ToBoolean(coil))
                {
                    msg = String.Format(
                        "Параметр записан не верно: должно быть {0}, устройство вернуло {1}",
                        this.AcCurrentRefereceElectrodeEn, coil);
                    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);
            }
            return;
        }
예제 #7
0
        //----------------------------------------------------------------------------
        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;
        }
예제 #8
0
        //----------------------------------------------------------------------------
        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;
        }
예제 #9
0
 //----------------------------------------------------------------------------
 /// <summary>
 /// Проверяет иницилизировано устройство или нет. Т.е. установлен
 /// серийный номер и следовательно не доступен регистр хранения 
 /// для записи серийного номера
 /// </summary>
 /// <param name="deviceInit">
 /// Если - true, то устройство инициализировано</param>
 /// <param name="error">Статус выполения операции по сети</param>
 public void VerifyInitDevice(
     out Boolean deviceInit, 
     out OperationResult error)
 {
     Boolean init;
     OperationResult result;
     this.LockGUI();
     // Читаем регистр хранения, если он не доступен, то устройство
     // инициализировано
     _MeasuringDevice.Read_HR_VerifyInitDevice(
         ref _Host, out init, out result);
     
     error = result;            
     deviceInit = init;
     this.UnLockGUI();
     return;
 }
예제 #10
0
 //----------------------------------------------------------------------------
 /// <summary>
 /// Читает визитную карточку устройства
 /// </summary>
 /// <param name="result">Результат выполения операции чтения визитной карточки устройства</param>
 /// <param name="deviceInfo">Визитная карточка устройства</param>
 public void ReadCallingCard(
     out OperationResult result, 
     out CallingCard deviceInfo)
 {
     this.LockGUI();
     this.Cursor = Cursors.WaitCursor;
     NGK.MeasuringDeviceTech.Classes.MeasuringDevice.CallingCardOfDevice.Read_IRs_CallingCard(
         ref _Host, out  result, 1, out deviceInfo);
     this.Cursor = Cursors.Default;
     this.UnLockGUI();
     return;
 }
예제 #11
0
        //----------------------------------------------------------------------------
        /// <summary>
        /// Читает версию аппаратного обеспечения подключенного устройства, 
        /// без созданного виртуального.
        /// </summary>
        /// <param name="host"></param>
        /// <param name="error"></param>
        /// <param name="addressSlave"></param>
        /// <param name="version"></param>
        public void Read_IR_HardWareVersion(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error, Byte addressSlave, out float version)
        {
            Modbus.OSIModel.Message.Result result;
            //String msg;
            UInt16[] registers;

            this.LockGUI();

            if (host == null)
            {
                version = 0;
                error = new OperationResult(OPERATION_RESULT.CONNECTION_ERROR, 
                    "Подключение к сети не создано");
            }
            else
            {
                if (host.DataLinkObject.IsOpen())
                {
                    result = host.ReadInputRegisters(addressSlave,
                        BI_ADDRESSES_OF_INPUTREGISTERS.VersionHardware,
                        1, out registers);

                    if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
                    {
                        version = ((float)registers[0]) / 100;
                        error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                    }
                    else
                    {
                        version = 0;
                        error = new OperationResult(OPERATION_RESULT.FAILURE, 
                            result.Description);
                    }
                }
                else
                {
                    version = 0;
                    error = new OperationResult(OPERATION_RESULT.CONNECTION_ERROR, 
                        "Содениение создано, но порт закрыт");
                }
            }
            this.UnLockGUI();
            return;
        }
예제 #12
0
        //------------------------------------------------------------------------------------------------------
        /// <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;
        }
예제 #13
0
        //----------------------------------------------------------------------------
        /// <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;
        }        
예제 #14
0
        //------------------------------------------------------------------------------------------------------
        /// <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;
        }
예제 #15
0
        //----------------------------------------------------------------------------
        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;
        }
예제 #16
0
        //----------------------------------------------------------------------------
        public void Write_HR_CurrentShuntValue(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            // Записываем новое значение в устройство
            Modbus.OSIModel.Message.Result result;
            UInt16 value = (UInt16)this.CurrentShuntValue;
            String msg;

            result = host.WriteSingleRegister(
                _AddressSlave,
                BI_ADDRESSES_OF_HOLDINGREGISTERS.CurrentShuntValue,
                ref value);

            if (result.Error != Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
            else
            {
                // Читаем записаное и сверяем результаты
                if ((UInt16)this.CurrentShuntValue != value)
                {
                    msg = String.Format(
                        "Значение записанного прараметра {0} не совподает с прочитанным {1}",
                        this.CurrentShuntValue, value);
                    error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, msg);
                }
                else
                {
                    error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                }
            }
            return;
        }
예제 #17
0
        //------------------------------------------------------------------------------------------------------
        #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;
                    }
            }

        }
예제 #18
0
        //----------------------------------------------------------------------------
        public void Write_HR_DateTime(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            // Записываем новое значение в устройство
            Modbus.OSIModel.Message.Result result;
            UInt16[] registers = new ushort[2] { 0, 0 };
            DateTime unixStartTime;
            DateTime dt = DateTime.Now;
            UInt32 totalSeconds;
            //String msg;
            TimeSpan ts;

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

            ts = (DateTime.Now.ToUniversalTime()).Subtract(unixStartTime);

            totalSeconds = Convert.ToUInt32(ts.TotalSeconds);

            unchecked
            {
                registers[0] = (UInt16)(totalSeconds >> 16); // Hi_byte
                registers[1] = (UInt16)(totalSeconds); // Lo byte
            }

            result = host.WriteMultipleRegisters(
                _AddressSlave,
                BI_ADDRESSES_OF_HOLDINGREGISTERS.DateTime,
                registers);

            if (result.Error != Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
            else
            {
                error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
            }
            // Проверку записанное осуществить невозможно, по причине хода часов!!!
            return;
        }
예제 #19
0
        //------------------------------------------------------------------------------------------------------
        /// <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;
        }
예제 #20
0
        //----------------------------------------------------------------------------
        public void Read_CL_AcCurrentRefereceElectrodeEn(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            Modbus.OSIModel.Message.Result result;
            //String msg;
            Modbus.State[] coils;

            result = host.ReadCoils(_AddressSlave,
                BI_ADDRESSES_OF_COILS.AcCurrentRefereceElectrodeEn, 1, out coils);

            if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                this.AcCurrentRefereceElectrodeEn =
                    Modbus.Convert.ToBoolean(coils[0]);
                error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
            }
            else
            {
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
        }
예제 #21
0
        //------------------------------------------------------------------------------------------------------
        public void Write_HR_SerialNumber(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            UInt64 serialNumber,
            out OperationResult error)
        {
            // Записываем новое значение в устройство
            Modbus.OSIModel.Message.Result result;
            UInt64 sn;
            UInt16[] value;
            //String msg;

            value = new ushort[3];
            value[2] = (UInt16)serialNumber; // Low
            value[1] = (UInt16)(serialNumber >> 16); // High
            value[0] = (UInt16)(serialNumber >> 32); // Upper

            result = host.WriteMultipleRegisters(
                _AddressSlave, BI_ADDRESSES_OF_HOLDINGREGISTERS.SerialNumber,
                value);

            if (result.Error != Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                // При операции записи произошла ошибка
                error = new OperationResult(OPERATION_RESULT.FAILURE, 
                    result.Description);
            }
            else
            {
                // После записи данный регистр становиться не доступен
                // Проверяем записанные данные
                this.Read_HR_SerialNumber(ref host,
                    out sn, out error);
                
                switch (error.Result)
                {
                    case OPERATION_RESULT.IllegalDataAddress:
                        {
                        //    // Чтение выполено успешно, проверяем данные
                        //    if (sn == serialNumber)
                        //    {
                        //        error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                        //    }
                        //    else
                        //    {
                        //        msg = String.Format(
                        //            "Ошибка записи серийного номера устройства. Не совпал записанное {0} и прочитанное значение {1}",
                        //            serialNumber, sn);
                        //        error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, msg);
                        //    }

                            error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                            break;
                        }
                    case OPERATION_RESULT.OK:
                        {
                            // При выполнении операции чтения произошла ошибка
                            error = new OperationResult(OPERATION_RESULT.FAILURE, 
                                "Ошибка: После инициализации устройсвта регистр хранения остался доступен");
                            break;
                        }
                    default:
                        {
                            error = new OperationResult(OPERATION_RESULT.FAILURE, error.Message);
                            break;
                        }
                }                
            }
            return;
        }
예제 #22
0
        //----------------------------------------------------------------------------
        public void Read_DI_CorrosionSensor3(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            Modbus.OSIModel.Message.Result result;
            //String msg;
            Modbus.State[] discreteInputs;

            result = host.ReadDiscreteInputs(_AddressSlave,
                BI_ADDRESSES_OF_DISCRETESINPUTS.CorrosionSensor3,
                1, out discreteInputs);

            if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                this.CorrosionSensor3 =
                    Modbus.Convert.ToBoolean(discreteInputs[0]);
                error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
            }
            else
            {
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
            return;
        }
예제 #23
0
        //----------------------------------------------------------------------------
        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;
        }
예제 #24
0
        //----------------------------------------------------------------------------
        public void Read_IR_HardWareVersion(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            Modbus.OSIModel.Message.Result result;
            //String msg;
            UInt16[] registers;

            result = host.ReadInputRegisters(AddressSlave,
                BI_ADDRESSES_OF_INPUTREGISTERS.VersionHardware,
                1, out registers);

            if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                this.HardwareVersion = ((float)registers[0]) / 100;
                error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
            }
            else
            {
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
            return;
        }
예제 #25
0
        //----------------------------------------------------------------------------
        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;
        }
예제 #26
0
        //----------------------------------------------------------------------------
        public void Read_IR_BattaryVoltage(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            Modbus.OSIModel.Message.Result result;
            //String msg;
            UInt16[] registers;

            result = host.ReadInputRegisters(_AddressSlave,
                BI_ADDRESSES_OF_INPUTREGISTERS.BattaryVoltage,
                1, out registers);

            if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                this.BattaryVoltage =
                    (float)(ToValue(registers[0]) * 0.01);
                error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
            }
            else
            {
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
            return;
        }
예제 #27
0
        //----------------------------------------------------------------------------
        public void Write_HR_PollingPeriodChannel2(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            // Записываем новое значение в устройство
            Modbus.OSIModel.Message.Result result;
            UInt16 value = (UInt16)(this.PollingPeriodChannel2 / 10);
            String msg;

            result = host.WriteSingleRegister(
                _AddressSlave,
                BI_ADDRESSES_OF_HOLDINGREGISTERS.PollingPeriodChannel2_4_20,
                ref value);

            if (result.Error != Modbus.OSIModel.ApplicationLayer.Error.NoError)
            {
                error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            }
            else
            {
                if ((value * 10) != this.PollingPeriodChannel2)
                {
                    msg = String.Format(
                        "Параметр записан не верно: должно быть {0}, устройство вернуло {1}",
                        this.PollingPeriodChannel2, value);
                    error = new OperationResult(OPERATION_RESULT.INCORRECT_ANSWER, msg);
                }
                else
                {
                    error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                }
            }
            return;
        }
예제 #28
0
        //----------------------------------------------------------------------------
        public void Read_IR_ReferenceElectrodeACCurrent(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            Modbus.OSIModel.Message.Result result;
            //String msg;
            UInt16[] registers;

            result = host.ReadInputRegisters(_AddressSlave,
                BI_ADDRESSES_OF_INPUTREGISTERS.ReferenceElectrodeAcCurrent,
                1, out registers);

            //if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            //{
            //    this._ReferenceElectrodeAcСurrent =
            //        (float)((registers[0]) * 0.01);
            //    error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
            //}
            //else
            //{
            //    error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
            //}
            switch (result.Error)
            {
                case Modbus.OSIModel.ApplicationLayer.Error.NoError:
                    {
                        this._ReferenceElectrodeAcСurrent = (float)((registers[0]) * 0.01);
                        error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                        break;
                    }
                case Modbus.OSIModel.ApplicationLayer.Error.IllegalDataAddress:
                    {
                        // Если возвращается исключение 0x2 (регистр не доступен для чтения)
                        // это является нормальной ситуацией.
                        // См. протокол: При чтении Input Register, определённого в Coil как 
                        // неактивный канал измерения возвращать исключение 0х02.
                        this._ReferenceElectrodeAcСurrent = 0;
                        error = new OperationResult(OPERATION_RESULT.OK, String.Empty);
                        break;
                    }
                default:
                    {
                        error = new OperationResult(OPERATION_RESULT.FAILURE, result.Description);
                        break;
                    }
            }
            return;
        }
예제 #29
0
        //----------------------------------------------------------------------------
        public void Read_HR_MeasuringVoltagePeriod(
            ref Modbus.OSIModel.ApplicationLayer.Master.Device host,
            out OperationResult error)
        {
            error = new OperationResult(OPERATION_RESULT.INVALID_OPERATION, 
                "Операция не применима к версии БИ(У)-01");
            //throw new InvalidOperationException("Операция не применима к версии БИ(У)-01");

            //ushort[] registers;
            //Modbus.OSIModel.Message.Result result;
            //UInt16 period = 0;

            //result = host.ReadHoldingRegisters(_AddressSlave,
            //    BI_ADDRESSES_OF_HOLDINGREGISTERS.MeasuringSupplyVoltagePeriod,
            //    1, out registers);

            //if (result.Error == Modbus.OSIModel.ApplicationLayer.Error.NoError)
            //{
            //    period = registers[0];
            //    error = new OperationResult(true, String.Empty);
            //}
            //else
            //{
            //    error = new OperationResult(false, result.Description);
            //}
            //return;
        }