Exemplo n.º 1
0
        public bool CanAddModbusMasterQuery(DeviceModbusMasterQuery modbusQuery)
        {
            ValidationErrorList.Clear();

            if((modbusQuery.QueryStatusAddress >= modbusQuery.RouteStartAddress) && (modbusQuery.QueryStatusAddress < modbusQuery.RouteStartAddress + modbusQuery.RegistersCount))
            {
                ValidationErrorList.Add("Наложение регистра статуса запроса с самим запросом");
                return false;
            }

            for (int route = 0; route < _device.RoutingMap.Count; route++)
            {
                if ((_device.RoutingMap[route].RouteTo >= modbusQuery.RouteStartAddress)
                    &&
                    (_device.RoutingMap[route].RouteTo < modbusQuery.RouteStartAddress + modbusQuery.RegistersCount))
                {
                    ValidationErrorList.Add(String.Format("Наложение целевых регистра запроса с маршрутом №{0}", route + 1));
                    return false;
                }
            }

            for (int port = 0; port < _device.Configuration.ModbusMasterQueriesOnUartPorts.Count; port++)
            {
                for (int query = 0; query < _device.Configuration.ModbusMasterQueriesOnUartPorts[port].Count; query++)
                {
                    if (_device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].QueryConfigured)
                    {
                        if (Utility.IsIntersect(modbusQuery.RouteStartAddress, modbusQuery.RouteStartAddress + modbusQuery.RegistersCount - 1, _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RouteStartAddress, _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RouteStartAddress + _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RegistersCount - 1))
                        {
                            ValidationErrorList.Add(String.Format("Наложение целевых регистров запроса с запросом Modbus master: порт № {0}, запрос № {1}", port + 1, query + 1));
                            return false;
                        }
                        if ((modbusQuery.QueryStatusAddress >= _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RouteStartAddress) && (modbusQuery.QueryStatusAddress < _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RouteStartAddress + _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RegistersCount))
                        {
                            ValidationErrorList.Add(String.Format("Наложение регистра статуса запроса с запросом Modbus master: порт № {0}, запрос № {1}", port + 1, query + 1));
                            return false;
                        }
                    }
                }
            }
            return true;
        }
Exemplo n.º 2
0
        public bool ValidateModbusMasterQuery(DeviceModbusMasterQuery modbusQuery,int portIndex = -1,int queryIndex=-1)
        {
            String portAndQueryInfo = "";
            if (portIndex >= 0 && queryIndex >= 0)
            {
                portAndQueryInfo = String.Format("[порт {0}, запрос {1}] ", portIndex + 1, queryIndex + 1);
                if (_device.Configuration.UartPorts[portIndex].PortProtocolType != Definitions.MODBUS_MASTER_PROTOCOL)
                    return true;
            }

            if (modbusQuery.QueryConfigured == false)
                return true;

            ValidationErrorList.Clear();

            bool retCode = true;

            if ((modbusQuery.QueryStatusAddress >= modbusQuery.RouteStartAddress) && (modbusQuery.QueryStatusAddress < modbusQuery.RouteStartAddress + modbusQuery.RegistersCount))
            {
                ValidationErrorList.Add(portAndQueryInfo+"Наложение регистра статуса запроса Modbus с самим запросом ");
                retCode = false;
            }

            if (modbusQuery.QueryStatusAddress < Definitions.USER_REGISTERS_OFFSET || modbusQuery.QueryStatusAddress > Definitions.USER_REGISTERS_OFFSET + _device.Configuration.HeaderFields.DeviceUserRegistersCount - 1)
            {
                ValidationErrorList.Add(String.Format(portAndQueryInfo + "Регистр статуса запроса Modbus за пределами области пользовательских регистров: {0}..{1}", Definitions.USER_REGISTERS_OFFSET, Definitions.USER_REGISTERS_OFFSET + _device.Configuration.HeaderFields.DeviceUserRegistersCount - 1));
                retCode = false;
            }

            if (modbusQuery.RouteStartAddress < Definitions.USER_REGISTERS_OFFSET || modbusQuery.RouteStartAddress > Definitions.USER_REGISTERS_OFFSET + _device.Configuration.HeaderFields.DeviceUserRegistersCount - 1)
            {
                ValidationErrorList.Add(String.Format(portAndQueryInfo + "Начало области целевых регистров запроса Modbus выходит за нижний предел области пользовательских регистров: {0}..{1}", Definitions.USER_REGISTERS_OFFSET, Definitions.USER_REGISTERS_OFFSET + _device.Configuration.HeaderFields.DeviceUserRegistersCount - 1));
                retCode = false;
            }

            if (modbusQuery.RouteStartAddress + modbusQuery.RegistersCount - 1 > Definitions.USER_REGISTERS_OFFSET + _device.Configuration.HeaderFields.DeviceUserRegistersCount - 1)
            {
                ValidationErrorList.Add(String.Format(portAndQueryInfo + "Область целевых регистров запроса Modbus выходит за верхний предел области пользовательских регистров: {0}..{1}", Definitions.USER_REGISTERS_OFFSET, Definitions.USER_REGISTERS_OFFSET + _device.Configuration.HeaderFields.DeviceUserRegistersCount - 1));
                retCode = false;
            }

            for (int route = 0; route < _device.RoutingMap.Count; route++)
            {
                if ( _device.RoutingMap[route].RouteConfigured
                    &&
                    (_device.RoutingMap[route].RouteTo >= modbusQuery.RouteStartAddress)
                    &&
                    (_device.RoutingMap[route].RouteTo < modbusQuery.RouteStartAddress + modbusQuery.RegistersCount))
                {
                    ValidationErrorList.Add(String.Format(portAndQueryInfo + "Наложение целевых регистров запроса Modbus с маршрутом №{0}", route + 1));
                    retCode = false;
                }
            }

            for (int port = 0; port < _device.Configuration.ModbusMasterQueriesOnUartPorts.Count; port++)
            {
                if (_device.Configuration.UartPorts[port].PortProtocolType != Definitions.MODBUS_MASTER_PROTOCOL)
                    continue;
                for (int query = 0; query < _device.Configuration.ModbusMasterQueriesOnUartPorts[port].Count; query++)
                {
                    if (_device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].QueryConfigured && modbusQuery != _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query])
                    {
                        if (Utility.IsIntersect(modbusQuery.RouteStartAddress, modbusQuery.RouteStartAddress + modbusQuery.RegistersCount - 1, _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RouteStartAddress, _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RouteStartAddress + _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RegistersCount - 1))
                        {
                            ValidationErrorList.Add(String.Format(portAndQueryInfo + "Наложение целевых регистров запроса с запросом Modbus master: порт № {0}, запрос № {1}", port + 1, query + 1));
                            retCode = false;
                        }
                        if ((modbusQuery.QueryStatusAddress >= _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RouteStartAddress) && (modbusQuery.QueryStatusAddress < _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RouteStartAddress + _device.Configuration.ModbusMasterQueriesOnUartPorts[port][query].RegistersCount))
                        {
                            ValidationErrorList.Add(String.Format(portAndQueryInfo + "Наложение регистра статуса запроса с запросом Modbus master: порт № {0}, запрос № {1}", port + 1, query + 1));
                            retCode = false;
                        }
                    }
                }
            }

            return retCode;
        }