Esempio n. 1
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;
        }
Esempio n. 2
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;
        }
Esempio n. 3
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;
        }
Esempio n. 4
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;
        }
Esempio n. 5
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;
        }
Esempio n. 6
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;
        }
Esempio n. 7
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;
                    }
            }

        }
Esempio n. 8
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;
        }        
Esempio n. 9
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;
        }