2. Quem sou eu?
● Paolo Oliveira
● Engenharia de Telecomunicações – IFCE
● LIT – Laboratório de Inovação Tecnológica
● Usuário python a uma década
3. Smart Grid
● Aplicação de conceitos de rede eletrica distruibuida
inteligente, que pode monitorar seu próprio fluxo
eletrico e se ajustar as condições adversas,
reconfigurando os dispositivos que a compõe através
da automação e integração de todos os elementos da
rede. E para tal, é necessário haver comunicação
entre elementos que acompoem.
4. Problemas do Mundo Real
● Infinidade de Protocolos de Comunicação, muitos
deles fechados (embora existam os abertos e bem
conhecidos como DNP3, Modbus e IEC61850);
● Rede Elétrica "analógica" (poucos ou nenhum
equipamento inteligente disponível);
● Conectividade complexa em locais distantes
(geralmente restrito ao GPRS);
● Etc.
6. SCADA
Supervisory Control And Data Acquisition
● Melhor forma de gerenciar.
Entretanto...
● Licenças “estupidamente” caras e individuais para
cada conexão;
● Só “fala” protocolos conhecidos e/ou abertos.
7. Solução
● Gateway integrador, decodificando os protocolos,
abertos e fechados, e traduzindo-os entre si,
permitindo interoperabilidade, ao passo em que que
fornece acesso a monitoramento e gerenciamento
industrial através do SCADA, e de forma genérica
através de webservice.
8. Necessidades na implementação da
Solução
● Garantia na execução de código em intervalos de
tempo finitos bem definidos;
● Facilidade em codificar e decodificar protocolos
proprietarios(parsing e validação de estruturas);
● Gerenciamento eficaz e simples de comunicação
serial e TCP/IP.
9. Garantia na execução de código em
intervalos de tempo finitos bem
definidos
● Criação de um “watchdog” com a biblioteca thread
● No construtor:
self.watchdog = threading.Timer(0.2, self.WDT)
self.watchdog.start()
● No método WDT:
def WDT(self):
● self.watchdog.cancel()
(…) # chamadas a serem executadas
self.watchdog = threading.Timer(0.2, self.WDT)
self.watchdog.start()
10. Garantia na execução de código em
intervalos de tempo finitos bem
definidos
● Iniciar todos os modulos via thread:
if __name__=='__main__':
threading.Thread(target=thread_modbus).start()
threading.Thread(target=thread_ws).start()
…
● Com isto, eu garantia meu código lendo o pool
Modbus a cada 0.2 segundos, tempo limite para
desarmar a rede elétrica de baixa tensão.
11. Executar o servidor modbus “fora”
● Implementação simples(<20 linhas de código);
● Quantidade imoral de acessos...
Deixa o S.O.
cuidar dele ;D
12. Facilidade em codificar e
decodificar protocolos proprietarios
Design de uma forma genérica de escrever protocolos:
● Definir todos os campos do frame como variáveis globais.
● Criar um método encode() que le as variaveis globais e “monta” o
pacote, computando tamanhos e CRC;
● Criar um método decode() que pega um frame e o decodifica,
liberando os valores nas variaveis globais;
● Uso massivo do pack e unpack da bibliteca struct;
● Fácil de trabalhar, fácil de fazer um novo, e sem necessidade de
mexer com o módulo parental, que so se importa em chamar
encode() e decode() dos módulos de cada protocolo.
14. Gerenciamento eficaz e simples de
comunicação serial e TCP/IP
● Bom, é python... Com os já muito bons modelos de
gerenciamento de conexão, unindo os métodos de
conexão e leitura dentro de um
try/except/else/finally, o sistema fica completamente
estável.
● Lembrar de sempre usar o
allow_reuse_address = True
para evitar dor de cabeça
15. Nem tudo são flores
● São valores enormes e dados que o python, por
padrão, não sabe lidar. Então mesmo depois de
entender os protocolos, é preciso converter os dados
para usá-los de alguma forma. E, digamos que não é
a coisa mais fácil do mundo...
17. E ainda assim, tem vezes que o python
sozinho não dá conta, ou demoraria muito
para “pythonizar” a solução.
Para ester momentos, nos temos...
18. CTYPES + muita coragem
● ctypes é a cola perfeita, mas ainda assim dá muito
trabalho;
● Muita coisa velha é feita em PIC, não existe
documentação do protocolo/funções;
● Converter código de PIC para python doi.
EXEMPLO