Traduzido de:

Wellisch, Daniel & Kunze, Stefan & Pöschl, Rainer. (2015). A Modular Software Implementation for Smart Charging Stations. 10.1109/SEDST.2015.7315217.

https://www.researchgate.net/publication/282847216_A_Modular_Software_Implementation_for_Smart_Charging_Stations

 

Uma implementação modular de software para estações SmartCharging

 

Abstract

O carregamento inteligente adiciona uma comunicação mais sofisticada ao processo de carregamento de veículos elétricos, permitindo novos recursos, como agendamento de horário. Portanto, pode fornecer uma contribuição valiosa para equilibrar a rede elétrica, pois o processo de carregamento pode ser agendado de uma maneira que reduza os picos de carga na rede. Os protocolos necessários para o carregamento inteligente, como a ISO 15118, estão sendo padronizados. Neste artigo, é proposta uma implementação modular de software para estações de carregamento inteligentes. Como linguagem de programação, o Node.js é escolhido, devido à sua programação assíncrona, bem como à sua funcionalidade sem bloqueio. Para fins de avaliação, este software é implementado em um demonstrador, composto principalmente de módulos prontos para uso.

1.INTRODUÇÃO

Neste artigo, é proposta uma implementação modular de software para uma estação de carregamento com capacidade de carregamento inteligente. Para fornecer um melhor entendimento, os conceitos básicos de cobrança inteligente e os padrões relevantes são brevemente explicados nesta seção. Os módulos de software desenvolvidos são implementados em uma plataforma de avaliação, desenvolvida especificamente para esse fim. Uma breve descrição dessa configuração é fornecida na seção a seguir.

 

Cobrança inteligente

No contexto deste documento, a cobrança inteligente deve ser referida como uma infra-estrutura de cobrança, que permite uma comunicação mais sofisticada entre o Equipamento de suprimento de veículo elétrico (EVSE), o veículo elétrico e um sistema central, que serve como entidade de gerenciamento. Ao implementar a comunicação mais sofisticada, novos recursos como agendamento, mecanismos aprimorados de autenticação ou troca de informações sobre contratos podem ser ativados [1].

Com o aumento do número de veículos elétricos, o carregamento convencional pode levar a picos de carga na rede elétrica, que devem ser compensados por capacidades adicionais para geração de energia [2]. Utilizando a capacidade de agendamento da cobrança inteligente, é possível fazer uma contribuição para equilibrar a rede elétrica. Para isso, o processo de carregamento é agendado de uma maneira, de modo a proporcionar um estresse desnecessário para a rede [3]. Importante por este meio é que isso não tem impacto negativo na experiência do motorista. O motorista pode especificar um horário no qual ele precisa que seu veículo esteja totalmente carregado. Somente dentro desse prazo, o agendamento é realizado. Em uma etapa posterior, os veículos elétricos podem servir como armazenamento temporário de energia para amortecer picos na geração de energia. A viabilidade deste conceito já foi demonstrada [4] [5].

O balanceamento da rede elétrica já é uma tarefa não trivial. No entanto, se tornará ainda mais complexo quando a parcela de fontes de energia renováveis ​​aumentar ainda mais, pois a geração de energia dessas fontes não é tão previsível quanto o caso das convencionais [6]. No entanto, metas ambiciosas para a parcela de energias renováveis ​​foram ratificadas. Na União Européia, esta parte deve atingir 20% até 2020 [7]. Na Alemanha, a meta é estabelecida ainda mais em 35% até 2020 e 80% até 2050 [7]. Considerando esses objetivos ambiciosos para energias renováveis, os veículos elétricos podem fornecer uma contribuição valiosa para equilibrar a rede elétrica no futuro.

Padrões relevantes

Para permitir uma ampla aceitação de cobrança inteligente, os veículos e as estações de carregamento de diferentes fabricantes devem ser interoperáveis. Para atender a essa demanda, são necessárias soluções padronizadas [8]. A norma IEC 61851-1, à qual as estações de carregamento convencionais atendem, especifica apenas uma comunicação rudimentar com o veículo, como a sinalização da corrente máxima ou do estado de carga [9]. No entanto, para o carregamento inteligente, esquemas de comunicação mais sofisticados e, portanto, novos padrões são necessários. Uma visão geral de uma configuração de carregamento inteligente e dos padrões relevantes é ilustrada na figura 1.

 

O Open Charge Point Protocol (OCPP) é usado para a comunicação entre o EVSE e o sistema central. Atualmente, a maioria das estações de carregamento disponíveis implementa o protocolo na versão 1.5, que não é suficiente para o carregamento inteligente, devido ao seu conjunto limitado de mensagens. A próxima versão 2.0, atualmente em fase de padronização, define um conjunto maior de mensagens, possibilitando o carregamento inteligente. O candidato à liberação atualmente disponível também especifica os chamados perfis de carregamento inteligente [1]. Uma outra vantagem do novo protocolo é a possibilidade de usar a JavaScript Object Notation (JSON). Isso permite um processamento de dados mais eficiente do que a notação baseada em Simple ObjectAccess Protocol (SOAP) usada na versão 1.5 [10].

 

A norma ISO 15118 especifica a comunicação aprimorada entre o EVSE e o veículo, necessária para o carregamento inteligente. É composto por oito partes, das quais apenas as duas primeiras foram finalizadas ainda. Entre outros, esse padrão permite recursos, como controle ativo de cobrança, gerenciamento de demanda e resposta [11]. A pilha de comunicação, de acordo com a ISO 15118, é ilustrada na figura 2.

 

 

Para a camada física, o Power Line Communication (PLC) é proposto na ISO / FDIS 15118-3 [13]. Ao usar esse método, os dados são modulados no sinal piloto de controle. A adequação desse esquema de modulação para aplicações de carregamento inteligente foi demonstrada por Lewandowski et al. [14] Os protocolos, que devem ser utilizados nas camadas quatro a sete do modelo ISO / OSI, são especificados na ISO 15118-2 [12] .

2.HARDWARE

 Desde que não exista uma plataforma de hardware adequada, que ofereça capacidade de carregamento inteligente, além de acesso completo à personalização de software, é desenvolvida uma plataforma de avaliação. Esse sistema é destinado apenas para fins de desenvolvimento e avaliação. A fim de minimizar o esforço de desenvolvimento, o design modular, que permite a utilização de vários módulos disponíveis no mercado, é escolhido. Um diagrama de blocos dos módulos de comunicação usados é ilustrado na figura 3. O circuito elétrico não é considerado no diagrama de blocos.

A seguir, é fornecida uma breve descrição dos módulos usados. O EVSE Controller é o módulo central do sistema de avaliação. É um computador incorporado equipado com um processador ARM. Todo o processo de carregamento é controlado por este módulo. Ele é conectado a todos os outros módulos da configuração usando uma variedade de interfaces. Via Ethernet, está conectado para o sistema central. Este canal de comunicação usa o protocolo OCPP 2.0. O software modular proposto por este documento é implementado neste módulo. A Pilot-Box é responsável pela comunicação rudimentar com o veículo. Ele gera o sinal piloto, de acordo com a IEC 61851-1. Também controla e monitora o processo de carregamento. Está conectado ao EVSE controller via uma interface Modbus. Isso permite que o módulo controlador controle o status da Pilot-Box e envie comandos para controlar o carregamento, como habilitar o processo. O módulo de prateleira usado é simplesmente conectado à instalação, sem quaisquer modificações. O módulo PLC é necessário para implementar o padrão ISO 15118 e, portanto, a capacidade de carregamento inteligente. Ele converte as mensagens recebidas do controlador EVSE através da interface Ethernet, para que possam ser transmitidas para a comunicação da linha de energia de veículos. Para isso, o módulo PLC suporta o padrão da linha de energia HomePlug Green PHY para a comunicação com o veículo, conforme proposto na ISO 15118-3 [13]. A interface entre o módulo controlador e o módulo de linha de energia usa TCP / IP em uma conexão Ethernet. O módulo usado também suporta o protocolo SLAC (Signal Level Attenuation Characterization), que permite selecionar o parceiro de comunicação mais próximo, no caso de várias estações de carregamento serem usadas simultaneamente. Como é o caso do módulo de prateleira Pilot-Boxan, é usado sem modificações. O módulo de entrada / saída (E / S) é o único componente da estação de carregamento, que é um desenvolvimento personalizado. É conectado ao controlador EVSE por meio de uma interface USB / RS232. O objetivo deste módulo é monitorar e controlar os circuitos de potência. Por exemplo, a quantidade de energia extraída da rede pode ser monitorada através de uma interface S0, que conecta o módulo de E / S a um contador de energia. Com base nos estados recuperados do módulo de E / S, uma simples detecção de erro pode ser implementada no software, executando no módulo module.

3.SOFTWARE

O objetivo do projeto é o desenvolvimento de um software modular para estações de carregamento com capacidade de carregamento inteligente. O software deve ser capaz de rodar em uma ampla variedade de tipos diferentes de estações de carregamento. Portanto, é importante separar o hardware do software para obter independência de plataforma. A implementação deve ser executada em vários sistemas operacionais, como Linux, Mac OS ou Windows. Para carregamento inteligente, existem vários cenários diferentes de infra-estruturas de software, como:

         O sistema central pode ser implementado na estação de recarga se apenas uma estação de carregamento for implantada

         O sistema central pode ser a instância de gerenciamento das estações de carregamento.

         O software pode ser conectado a outras instâncias que o sistema central.

         O software da estação de carregamento pode ser executado várias vezes em uma estação.

Para cobrir todos esses cenários, a implementação precisa de um alto grau de flexibilidade. Em termos de diferentes módulos de softwares, flexibilidade significa uma interface personalizável entre os módulos. No software proposto, o sistema central é executado em um servidor separado e a estação de carregamento é executada diretamente na estação. O sistema operacional usado para o demonstrador é o Linux. Como o software da estação de carregamento precisa lidar com conexões diferentes e múltiplas simultaneamente, é necessário que as conexões não se bloqueiem. Se um processo bloquear os dados do fluxo do programa, eles podem ser perdidos. Devido às altas tensões, os dados perdidos podem resultar em danos ao usuário ou ao equipamento. Em detalhes, o software precisa lidar com as seguintes conexões diferentes simultaneamente:

         TCP / IP: Conexão à infra-estrutura OCPP 2.0

         TCP / IP: Conexão ao módulo PLC para permitir o carregamento inteligente

         Modbus: Controlando o processo de carregamento

         USB / Serial: obtenha dados de medição.

Para lidar com todas essas conexões, é necessário um alto esforço para o software em geral. Devido a esse fato, é importante que o software seja processado em alta velocidade, para que nenhuma resposta do solicitante de uma conexão seja perdida. Com linguagens de programação tradicionais como C / C ++, todas as conexões precisavam ser tratadas por um thread separado. Desenvolver e coordenar todos esses encadeamentos com comunicação entre processos requer muito esforço. Em vez de uma linguagem de programação de implementação C / C ++, com manipulação de conexão adequada, foi preferida. O Node.js parece ser uma boa escolha em termos de manipulação de conexão e velocidade de processamento.

Node.js

Node.js é uma plataforma de software que permite executar o JavaScript com o Google V8 Engine no lado do servidor. A linguagem em si oferece todos os recursos do lado JavaScript do cliente. Node.js tem várias vantagens quando se trata de multitarefa ou manipular diferentes conexões simultaneamente .

 

A própria plataforma de software Node.js é um aplicativo de thread único. Com essa abordagem, cálculos intensos, que precisam de mais tempo para serem processados, bloqueariam o software. É por isso que o Node.js tem a capacidade de terceirizar computações intensas, como operações de E/S ou manipulação de conexões. O mecanismo de terceirização depende da infra-estrutura orientada a eventos do Node.js. Internamente, a solicitação para uma operação de E/S é tratada pelo sistema operacional. Como mostra a Figura 4, o sistema operacional lida com a tarefa solicitada, enquanto o encadeamento principal é livre e pode prosseguir. Esse mecanismo é chamado de E/S sem bloqueio. Quando o sistema operacional termina suas tarefas, o thread principal é interrompido. O resultado da tarefa terceirizada é fornecido por uma função de retorno de chamada, que é um dos principais recursos da programação assíncrona e sempre será chamada quando uma tarefa terceirizada for concluída. A programação assíncrona é o recurso mais importante para o software da estação de carregamento. Em muitas operações de E/S, como manipulação de conexão, a programação assíncrona é automaticamente tratada pelo sistema operacional. Se necessário, esse recurso também pode ser forçado usando o módulo de processo filho [15].

Como mostra a Figura 5, o próprio Node.js usa uma abordagem modular. Como já foi dito, para a independência da plataforma, é necessário que a linguagem de programação seja executada na maioria dos sistemas operacionais comuns. Na arquitetura Node.js, a interface libuv é uma camada de abstração. Ele se comunica com a libev (Linux / Mac) ou iocp (Windows) e separa a interface Node.js da abstração de hardware do sistema operacional. Com esse mecanismo, a interface de libuv para Node.js sempre é a mesma, independentemente do sistema operacional em que o software estiver instalado. O módulo libuv também é responsável por todas as operações de E/S assíncronas. O acesso do Node.js ao sistema de arquivos do sistema operacional também é tratado pela interface do libuv [15]. O Node.js é muito semelhante ao JavaScript e também precisa de um ambiente de tempo de execução. O próprio mecanismo permite a dependência da plataforma em termos do sistema operacional. O V8Engine do Google, como o tempo de execução, acelera o processamento do código JavaScript e fornece alto desempenho para o software implementado. A compilação de tempo de Justin e o cache embutido aceleram adicionalmente o processamento de código. Como mostrado na Figura 5, a camada superior da arquitetura contém a biblioteca padrão. Neste módulo, todos os recursos de vocabulário e regular de programação estão incluídos. Representa a funcionalidade nativa do Node.js. Para acessar essas funções, não são necessárias ações adicionais. Se as bibliotecas padrão não atenderem aos requisitos de um aplicativo, elas poderão ser expandidas com vários módulos. Esses módulos são escritos em JavaScript e podem ser personalizados, se necessário. O Node.js fornece um sistema de gerenciamento de idade do pacote, chamado gerenciador de pacotes do nó (npm), onde módulos adicionais podem ser pesquisados, instalados, atualizados ou excluídos. Basicamente, é uma plataforma de intercâmbio onde os programadores podem compartilhar projetos de software. Esses módulos são escritos para fins especiais e geralmente não correspondem exatamente aos requisitos de outro projeto, mas também podem ser personalizados. Se nem um módulo nativo, nem um módulo npm atende às necessidades de um aplicativo, o Node.js pode ser estendido com uma biblioteca C. O núcleo do Node.js é implementado em C / C ++, portanto, é possível acessar o código C via Node.js. Se compilado em uma biblioteca compartilhada, o Node.js pode acessá-lo diretamente. Além dos requisitos para o hardware da estação de carregamento, também existem requisitos específicos de software para a estação de carregamento. À primeira vista, o Node.js parece ser uma boa escolha, devido ao manuseio confiável da conexão. O Node.js é referido como uma linguagem de programação de alto nível, mas a maioria dos módulos é baseada em uma comunicação de baixo nível. Originalmente, o Node.js foi desenvolvido para aplicativos como servidores da Web, facilitando assim a linguagem de programação para lidar com conexões TCP.USB e Modbus, no entanto, não são aplicativos típicos para o Node.js.

Implementação

Como já mencionado, o software deve lidar com várias conexões diferentes. A Figura 6 mostra um diagrama de blocos do software implementado. Para cada módulo de hardware implementado, é necessário um módulo de software individual.

Para comunicar a cobrança de dados relevantes, é necessária uma conexão com um sistema central, que atua como uma entidade gerenciadora e comunicará a cobrança de dados relevantes. Os dados são transferidos no formato JSON, proposto no padrão OCPP 2.0. Como canal de comunicação, Ethernet ou UMTS podem ser usados, no entanto, o protocolo subjacente é o TCP / IP. Além disso, o Node.js de comunicação possui o módulo Websocket. O princípio Websocket é um protocolo que opera com base no TCP. Faz parte do padrão HTML 5 e é uma das funcionalidades nativas do Node.js. Os Websockets estendem a comunicação cliente-servidor com um canal de retorno. Este canal permite uma comunicação bidirecional entre os dois participantes [15]. A interface Websocket é especificada pelo World Wide Web Consortium (W3C). Para o próprio processo de cobrança, é crucial monitorar o processo e obter dados dele. O módulo de E/S desenvolvido sob encomenda é capaz de obter dados para medição e monitoramento. A comunicação ocorre via USB. O módulo de E/S é detectado como um dispositivo USB, em conformidade com a classe de dispositivo de comunicação (CDC), portanto, pode ser acessado por comunicação serial. Como não existe uma biblioteca padrão no Node.js que possa lidar com a comunicação serial, é necessário obter um módulo adicional. Com o módulo gerenciador de pacotes npm pode ser baixado, capaz de lidar com esse tipo de conexão. Depois que o módulo é instalado, o Node.js é capaz de estabelecer uma conexão com um dispositivo USB CDC. A implementação do módulo também permite operações baseadas em eventos, permitindo a programação assíncrona com E/S sem bloqueio. O software pode acessar as funções especiais de E/S do módulo. A recepção dos dados é baseada em eventos. O software pesquisa periodicamente o módulo de E/S para obter o status do circuito de energia. Através da verificação cruzada dos estados do veículo e do módulo de E/S, é possível detectar erros. Por exemplo, se a estação de carregamento parar de carregar, os interruptores da fonte de alimentação deverão estar abertos - se estiverem fechados, ocorreu um erro. Ao final de cada processo de carregamento, o software solicita os dados uma última vez ao módulo de E/S, para obter os dados de medição da energia consumida no veículo. O fluxo de controle do processo de carregamento é tratado pela Pilot-Box. Ele se comunica com o EVSE via Modbus. Em geral, o Modbus é um sistema de comunicação baseado em TCP, mas o Node.js não pode lidar com isso com suas bibliotecas padrão. Os módulos npm existentes são escritos para outros fins e não atendem às necessidades específicas da comunicação necessária com o Pilot-Box. Para esse fim, é utilizada uma biblioteca C separada, que permite a comunicação Modbus. Para a biblioteca C, a biblioteca de código aberto libmodbus é usada. É uma biblioteca padrão que pode ser baixada e incluída em qualquer código C. Com a ajuda do libmodbus, é desenvolvido um programa em C que permite funcionalidades básicas para a comunicação Modbus. As funções deste programa são capazes de enviar ou receber dados com um dispositivo que pode lidar com o protocolo Modbus. Fora dessas funções, uma biblioteca compartilhada é criada. Uma vez instalada a biblioteca no controlador EVSE, a biblioteca pode ser acessada através do módulo Node.js. A própria Pilot-Box possui vários registros diferentes que agora podem ser lidos ou gravados. Para o processo básico de carregamento, existe um registro que precisa ser definido ou liberado para iniciar ou parar o carregamento. Para a capacidade de carregamento inteligente, a comunicação da estação de carregamento para o veículo é crucial. A conexão física entre as duas entidades é realizada pelo módulo PLC. O software precisa enviar dados estruturados especiais para o veículo. O conjunto de mensagens, criptografia e fluxo de controle é especificado no ISO 15118. Os dados são modulados no piloto de controle usando um padrão de linha de energia. Nas camadas superiores, a comunicação é baseada em TCP/IP. O software da estação de carregamento envia dados ao módulo PLC, que envia os dados via PLC para o veículo. Para a ISO 15118 já existem implementações. Como algumas partes do protocolo ainda estão em desenvolvimento, as implementações estão em um estágio inicial. Uma abordagem promissora é o projeto de código aberto OpenV2G, que é implementado em C [16]. A conversão do projeto do código C para o código Node.js exigiria muito esforço. Portanto, o código C é desmontado e as funções básicas são extraídas. Com essas funções, uma biblioteca C compartilhada é criada e acessada através do módulo Node.js.

4.CONCLUSÃO

A tecnologia de carregamento inteligente pode fornecer uma contribuição para resolver problemas de balanceamento em futuras redes de energia. Atualmente, a demanda por uma nova solução de balanceamento da rede pode não ser atendida, mas com o aumento da participação de veículos elétricos e de fontes renováveis ​​de energia, essa problemática se intensificará e novas formas de balanceamento da rede poderão se tornar necessárias. Neste artigo, é proposta uma implementação modular de software para estações de carregamento inteligente. Para fins de demonstração, o software é implementado em um sistema modular de avaliação, em que o sistema central é implementado em um servidor não na estação de carregamento. No entanto, devido à flexibilidade do software, ele pode ser facilmente ajustado para outros cenários. Como a linguagem de programação Node.js é proposta. Devido à sua abordagem assíncrona, bem como às E/S sem bloqueio, uma implementação do Node.js. é mais simples que a do C/C++, onde seria necessário um multi-threading complicado. O Node.js fornece um design de software mais simples, no entanto, todas as restrições de tempo para a comunicação podem ser cumpridas. A funcionalidade da função soft é dividida em vários módulos, cada um responsável por uma parte dedicada da comunicação, necessária para o carregamento inteligente. Ao fazer isso, as implementações dos vários protocolos de comunicação são estritamente separadas uma da outra. Por um lado, isso permite reutilizar módulos individuais para outros projetos, como estações de carregamento convencionais, que devem ser atualizados do OCPP 1.5 para a versão 2.0. Por outro lado, o software pode ser facilmente mantido ou ajustado. Isso pode ser vantajoso, considerando que o processo de padronização dos protocolos relevantes de carregamento inteligente ainda não está concluído. Portanto, são possíveis alterações nos padrões, que devem conseqüentemente também ser aplicados ao software proposto.

ACKNOWLEDGMENT

A pesquisa que conduz aos resultados apresentados neste documento faz parte do projeto “Desenvolvimento de uma estrutura para estações de carregamento de veículos elétricos” (em alemão: “iLEM-Entwicklung eines Frameworks for¨ Lad Ladationation”), financiado pelo Ministério da Economia da Baviera, Media, Energyand Technology sob concessão IUK-1212-0008 // IUK417 / 006.

REFERENCES

[1] Open Charge Point Protocol 2.0 - Interface description between Charge Point and Central System. Protocol Specification Release Candidate 2 Document Version 2.0.0. Open Charge Alliance, 2014.

[2] S. Mal et al. “Electric vehicle smart charging and vehicle-to-grid operation”. In: International Journal of Parallel, Emergent and Distributed Systems 28.3 (June

2013), pp. 249–265.

[3] R. Freire et al. “Integration of renewable energy generation with EV charging strategies to optimize grid load balancing”. In: 2010 13th International IEEE Conference on Intelligent Transportation Systems (ITSC). 2010, pp. 392–396.

[4] J. Ferreira et al. “Smart electric vehicle charging system”. In: 2011 IEEE Intelligent Vehicles Symposium (IV). 2011, pp. 758–763.

[5] P. Bauer et al. “Charging of electric vehicles and impact on the grid”. In: MECHATRONIKA, 2010 13th International Symposium. 2010, pp. 121–127.

[6] I. Stadler. “Power grid balancing of energy systems with high renewable energy penetration by demand response”. In: Utilities Policy. Sustainable Energy and Transportation Systems 16.2 (June 2008), pp. 90–98.

[7] K. Mainzer et al. “A high-resolution determination of the technical potential for residential-roof-mounted photovoltaic systems in Germany”. In: Solar Energy 105 (June 2014), pp. 715–731.

[8] S. Ruthe et al. “Study on V2G Protocols against the Background of Demand Side Management”. In: International Journal of Interoperability in Business Information Systems (IBIS) 1.6 (2011), pp. 33–44.

[9] Electric vehicle conductive charging system – Part 1: General requirements. International Standard IEC 61851-1 Edition 2.0. International Electrotechnical Commission, 2010.

[10] K. Hameseder, S. Fowler, and A. Peterson. “Perfor-

mance analysis of ubiquitous web systems for SmartPhones”. In: 2011 International Symposium on Performance Evaluation of Computer Telecommunication Systems (SPECTS). 2011, pp. 84–89.

[11] Road vehicles - Vehicle to grid communication interface - Part 1: General information and use-case definition. International Standard ISO 15118-1:2013. International Organization for Standardization, 2013, p. 65.

[12] Road vehicles - Vehicle to grid communication interface - Part 2: Network and application protocol requirement. International Standard ISO 15118-2:2014. International Organization for Standardization, 2014, p. 342.

[13] Road vehicles - Vehicle to grid communication interface - Part 3: Physical and data link layer requirements. Standard in development ISO/FDIS 15118-3. International Organization for Standardization, 2014.

[14] C. Lewandowski et al. “Performance Evaluation of PLC over the IEC 61851 Control Pilot Signal”. In: Proceedings of the 5th Workshop on Power Line Communications. 2011.

[15] S. Springer. Node.js Das umfassende Handbuch. 1st ed. Bonn: Galileo Press, 2013.

[16] Open Vehicle to Grid.URL: http://openv2g.sourceforge. net/ (visited on 02/25/2015).