Você está na página 1de 206

Treinamento Cicode

Treinamento Cicode

Alex Lopes Brito


Engenheiro Eletricista

Schneider Electric- Treinamento- Junho/2009 2


Os Objetivos do Curso
Ao final deste Curso de Treinamento você:
●Terá um bom conhecimento do Cicode e estará apto a fazer uso do
mesmo;
●Poderá utilizar o Cicode em comandos e expressões;
●Estará habilitado para aplicar o que você aprendeu na sua aplicação;
●Poderá escrever suas próprias funções do Cicode;
●Saberá como depurar suas próprias funções do Cicode.

Schneider Electric- Treinamento- Junho/2009 3


Treinamento Cicode
1º Dia:
● Introdução a programação com Cicode
● Introdução ao Cicode
● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
Programa: 2º Dia:
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Programa
Schneider Electric- Treinamento- Junho/2009 4
Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
Programa: ● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 5
Introdução a programação com
Cicode

Schneider Electric- Treinamento- Junho/2009 6


O que é o Cicode?
O Cicode é uma linguagem de programação de computador simples, fácil de
utilizar que foi projetada especialmente para aplicações de controle e
monitoração.
É uma linguagem estruturada, similar ao “C” ou ao Visual Basic.

Com o Cicode, você tem acesso a todas as variáveis, alarmes, tendências,


relatórios, etc em tempo real de um projeto do Vijeo Citect. Além disso, você
pode utilizar o Cicode para intercomunicar-se com diversos recursos do seu
computador tais como sistema operacional e portas de comunicação.
O Cicode suporta características avançadas que incluem multitarefa
preemptivo, multi-treads e chamadas de procedimentos remotos que iremos
discutir durante este curso.

Schneider Electric- Treinamento- Junho/2009 7


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
Programa: ● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 8
Introdução ao Cicode

Schneider Electric- Treinamento- Junho/2009 9


Objetivos do Capítulo
Neste capítulo você irá aprender:
●Comandos
●Configuração de Variáveis
●Expressões
●Instruções Variadas
●Obtenção de Entrada do Operador
●Chamada de funções em comandos e expressões
●Passar dados para funções
●Passar vários argumentos
●Passar argumentos numéricos
●Passar argumentos de variáveis
●Retorno de dados das funções
●Início de funções quando arrancando com o sistema

Schneider Electric- Treinamento- Junho/2009 10


Comandos
Os comandos do Cicode constituem os elementos de controle através
do qual o Vijeo Citect controla e monitora um sistema. Você utiliza estes
comandos para controlar o seu sistema do Vijeo Citect e
conseqüentemente os processos na planta.
Podemos inclusive configurar comandos para serem executados
automaticamente:
●Quando o operador faz o login ou o logout no sistema;
●Quando uma página gráfica é acessada, quando está sendo mostrada ou
quando é fechada;
●Quando um alarme é disparado;
●Em um relatório
●Quando um evento é disparado;

Schneider Electric- Treinamento- Junho/2009 11


Comandos
Este comando
muda o texto
para LIGADO

Schneider Electric- Treinamento- Junho/2009 12


Configuração de Variáveis
Os comandos executam tarefas específicas tais como atribuir valores à
variáveis ou mudar o status de um bit.

Execute
BOMBA_CMD = 1;
Command

Execute
BOMBA_CMD = 0;
Command

Schneider Electric- Treinamento- Junho/2009 13


Configuração de Variáveis
Se por exemplo, temos um tag analógico chamado TIC_P4_SP pode-
se atribuir o valor 10 emitindo o seguinte comando:

Execute
TIC_P4_SP = 10;
Command

Schneider Electric- Treinamento- Junho/2009 14


Configuração de Variáveis
Podemos também atribuir a esta variável o valor de uma outra variável
analógica da seguinte forma:

Execute
TIC_P4_SP = TIC_P1_SP;
Command

Schneider Electric- Treinamento- Junho/2009 15


Expressões

Uma expressão do Cicode é o elemento básico da Linguagem do Cicode;

Uma expressão pode ser uma constante, o valor de um tag de variável ou o resultado de

uma equação complexa.

Você pode utilizar expressões para mostrar e armazenar dados de forma a possibilitar

monitoração e análise, como também para disparar vários elementos em seu sistema, tais como

alarmes, eventos, relatórios, etc.

Você pode inserir uma expressão do Cicode em qualquer propriedade do objeto e ou figura.

Schneider Electric- Treinamento- Junho/2009 16


Expressões

Numeric
8+4
Expression

Schneider Electric- Treinamento- Junho/2009 17


Executando Cálculos
Você pode também executar cálculos matemáticos em declarações do
Cicode, como por exemplo:

Execute
MILL1_SPEED = MILL2_SPEED + MILL3_SPEED - 100;
Command

Resultado = Operando1 + Operando2 + Operando3;

Schneider Electric- Treinamento- Junho/2009 18


Visualização de Dados

Execute
TIC_HOLD_PV
Command

Execute
TIC_HOLD_PV + TIC_P4_PV
Command

Schneider Electric- Treinamento- Junho/2009 19


Declarações Múltiplas
Para executar diversas tarefas ao mesmo tempo, você pode combinar
declarações nas propriedades dos comandos separando-as por ponto e
vírgula (;) conforme mostrado abaixo:

TIC_HOLD_PV = TIC_P4_PV;
Execute
NOME_BATELADA = ”RACAO
Command ESPECIAL”;
LIC_SILO_SP = 450;

Schneider Electric- Treinamento- Junho/2009 20


Obtendo Entrada de Dados do Operador
Você pode definir um comando de teclado como uma seqüência de
teclas, para executar uma tarefa específica cada vez que a seqüência
for digitada, como por exemplo:

Key Sequence
F2 Enter

Execute
LIC_BALANCE_SP = 10
Command

Schneider Electric- Treinamento- Junho/2009 21


Obtendo Entrada de Dados do Operador

Schneider Electric- Treinamento- Junho/2009 22


Diferenças entre ArgValueX e ArgX

●O argumento ArgValueX comprova que o operador introduziu um

número, enquanto que ArgX não.

●Se o operador utiliza ArgX para efetuar uma entrada, este poderá

introduzir um número ou uma letra, que será escrito no tag.

●Devemos utilizar ArgX quando estivermos passando argumentos

para tags do tipo STRING.

Schneider Electric- Treinamento- Junho/2009 23


Chamando Funções em Comandos e
Expressões
Você pode chamar uma função inserindo o nome dela em qualquer
comando ou expressão. A sintaxe está mostrada abaixo:

Execute
FunctionName(Arg1, Arg2, ...);
Command

FunctionName >> é o nome da Função


Arg1, Arg2, ... >> são os argumentos que você passa para a função

Schneider Electric- Treinamento- Junho/2009 24


Passando Dados para as Funções

O parêntese () em uma declaração a identifica como uma função e


contêm seus argumentos (quando aplicável). Os argumentos são
valores ou variáveis que são passadas para dentro da função quando
ela é executada.

Schneider Electric- Treinamento- Junho/2009 25


Argumentos do tipo STRING
As funções podem requerer diversos argumentos ou, como no
seguinte exemplo, um único argumento.

Execute
PageDisplay("Caldeira1");
Command

O seguinte exemplo utiliza a função Prompt() para mostrar a


mensagem "Pressione F1 para Ajuda" quando o comando for executado.

Execute
Prompt("Pressione F1 para Ajuda");
Command

Schneider Electric- Treinamento- Junho/2009 26


Passando Múltiplos Argumentos
Algumas funções requerem diversos argumentos. Você deve listar
todos os argumentos entre os parênteses e separa-los por vírgula, como
no seguinte exemplo.

Execute
Login("Manager", "ABC");
Command

Schneider Electric- Treinamento- Junho/2009 27


Passando Argumentos Numéricos
Você pode passar números (inteiros e de ponto flutuante) diretamente
para uma função, como por exemplo:

Execute
AlarmAck(2, 35);
Command

Schneider Electric- Treinamento- Junho/2009 28


Passando Variáveis como Argumentos
Quando variáveis (tais como dados de tempo real) são utilizadas como
argumentos, o valor da variável é que é passado e não a própria
variável.

Execute
DspStr(25, "TextFont", NIVEL);
Command

Schneider Electric- Treinamento- Junho/2009 29


Retornando dados das Funções
 Algumas funções retornam dados para a declaração de chamada (um comando ou expressão).

 Algumas funções simplesmente retornam um valor que indica sucesso ou falha na execução da

função;

 As seguintes funções PageNext() e PageDisplay() retornam 0 (zero) se a página foi mostrada

com sucesso. De outra forma irão retornar um número de erro. Para a maioria das aplicações, você

poderá ignorar este valor de retorno.

Algumas funções retornam dados que você pode utilizar em uma expressão ou comando. A função

Date() retorna a data corrente como um string.

Schneider Electric- Treinamento- Junho/2009 30


Retornando dados das Funções

Execute
Date();
Command

On page
entry Prompt("Ola," + FullName())

Schneider Electric- Treinamento- Junho/2009 31


Executando funções quando partindo o
sistema

1.Avance pelo Wizard de Setup


do Computador até encontrar o
seguinte diálogo:

Schneider Electric- Treinamento- Junho/2009 32


Executando funções quando partindo o
sistema

2.Clique no botão Modify. A


seguinte caixa de diálogo será
mostrada.

Schneider Electric- Treinamento- Junho/2009 33


Executando funções quando partindo o
sistema

3.Digite Startup() e pressione o


botão OK. A figura abaixo ilustra:

Schneider Electric- Treinamento- Junho/2009 34


Executando funções quando partindo o
sistema
4.Pressione o botão Next até concluir o Wizard de Setup do
Computador. No arranque do aplicativo, a função Startup() será
executada. Esta função faz parte do aplicativo entregue por seu instrutor
e tentará entre outras coisas, estabelecer uma conexão com um banco
ACESS exibindo a mensagens ao operador.

5.Se a conexão for feita com sucesso, a seguinte mensagem será


ecoada na tela. Caso contrário, a mensagem de erro se fará presente.

Schneider Electric- Treinamento- Junho/2009 35


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
Programa: ● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 36
Operadores de Variáveis

Schneider Electric- Treinamento- Junho/2009 37


Objetivos do Capítulo
Neste capítulo você irá aprender sobre:
●Operadores matemáticos;
●Operadores lógicos;
●Operadores de bits;
●Operadores relacionais;
●Operadores de formato;
●A ordem de precedência dos operadores.

Schneider Electric- Treinamento- Junho/2009 38


Classes de Operadores
O texto abaixo descreve as cinco classes de operadores disponíveis
no Vijeo Citect.

Schneider Electric- Treinamento- Junho/2009 39


Operadores Matemáticos

Operadores Descrição
+ Adição (para valores numéricos)
+ Concatenação (para variáveis do tipo string)
- Subtração
* Multiplicação
/ Divisão
MOD Módulo (resto da divisão)

Schneider Electric- Treinamento- Junho/2009 40


Exemplos

TAG_1 = TAG_2 MOD 100

Prompt(“O valor do Tag 1 é” + IntToStr(Tag_1));

Isto é um String Isto é um String

Schneider Electric- Treinamento- Junho/2009 41


Operadores Lógicos

Operador Descrição
AND Logica AND
OR Logica OR
NOT Logica NOT

Schneider Electric- Treinamento- Junho/2009 42


Operadores de Bit
Operador Descrição
BITAND Bitwise AND
BITOR Bitwise OR
BITXOR Exclusive OR

●Os operadores de bit podem ser utilizados em palavras ou em bits


individuais.

Ex -1. 11011 AND 1101 resulta em 01001.

Schneider Electric- Treinamento- Junho/2009 43


Operadores Relacionais

Operador Descrição
= IGUAL
<> DIFERENTE DE
< MENOR QUE
> MAIOR QUE
<= MENOR OU IGUAL QUE
>= MAIOR OU IGUAL QUE

Schneider Electric- Treinamento- Junho/2009 44


Operador de Formato
O operador de formato é utilizado para converter valores numéricos em
strings formatadas para propósitos de apresentação em telas.

Operador Descrição
: (colon) Formatação em String

Por exemplo, para converter um valor numérico em uma string nós


teríamos:

TAG_1: ####.#

Schneider Electric- Treinamento- Junho/2009 45


Ordem de Precedência dos Operadores

1. ()
2. NOT
3. *, /, MOD
4. :
5. +, -
6. <, >, < =, > =
7. =, < >
8. AND
9. OR
10. BITAND, BITOR, BITXOR

Por exemplo, na seguinte expressão temos:

TAG_1 OR TAG_2 AND NOT TAG_3

Schneider Electric- Treinamento- Junho/2009 46


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
Programa: ● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 47
O editor do Cicode

Schneider Electric- Treinamento- Junho/2009 48


Objetivos do Capítulo

Neste capítulo você irá aprender:


●Como iniciar o Editor de Cicode;
●Acessar erros nas linhas numeradas;
●Navegação por arquivos;
●Ferramentas de Edição;
●Ferramentas de Funções;
●Preferências.

Schneider Electric- Treinamento- Junho/2009 49


Como iniciar o Editor do Cicode
O Editor do Cicode pode ser iniciado clicando-se no botão do Editor
do Cicode ou via menu TOOLS|Cicode Editor quando no Vijeo Citect
Explorer.

Schneider Electric- Treinamento- Junho/2009 50


Criando um novo Arquivo do Cicode

No Editor do Cicode, clique


no botão ou no menu,
selecione File | New.

Schneider Electric- Treinamento- Junho/2009 51


Uso do Goto para acessar erros
O Suporte do Compilador para erros permite um rápido acesso a erros
de compilação. Quando um erro do Cicode é encontrado, um diálogo
como o apresentado abaixo será mostrado.

Schneider Electric- Treinamento- Junho/2009 52


Compilando e executando

Você pode compilar e executar um projeto de dentro do Editor do


Cicode utilizando a barra de ferramentas e clicando no botão . Você
também pode compilar um projeto sem executá-lo clicando no botão .

Schneider Electric- Treinamento- Junho/2009 53


Navegação por Arquivos
O Editor do Cicode foi melhorado de forma a permitir a modificação de
códigos mais rapidamente e também mais facilmente. Uma destas
novas características é a janela Files, que permite visualizar os arquivos
do Cicode de um determinado projeto em uma vista do tipo árvore.

Schneider Electric- Treinamento- Junho/2009 54


Navegação por Arquivos
Open Files:
Na ficha Open Files tem-se a listagem de todos os arquivos de código
atualmente abertos no Editor do Cicode. Nesta janela temos o path completo
destes arquivos mostrados.

Schneider Electric- Treinamento- Junho/2009 55


Navegação por Arquivos
Open Project:
Na ficha Open Project tem-se a listagem de todos os arquivos de código do
projeto que está atualmente selecionado no Citect Explorer. Podemos abrir os
arquivos a partir desta ficha aplicando um duplo clique no nome do arquivo
desejado.

Schneider Electric- Treinamento- Junho/2009 56


Navegação por Arquivos
All Projects:
Na ficha All Projects tem-se a listagem de todos os arquivos de código de
todos os projetos que estão atualmente vinculados ao Citect Explorer. Podemos
também abrir os arquivos a partir desta ficha aplicando um duplo clique no nome
do arquivo desejado.

Schneider Electric- Treinamento- Junho/2009 57


Ferramentas de Edição
Janelas acopláveis e barras de ferramentas:
O Editor do Cicode permite ao usuário manipular a área de visualização da
área de trabalho.

Schneider Electric- Treinamento- Junho/2009 58


Ferramentas de Edição
Movimentação das barras de ferramentas:
Para mudar a localização de barras de ferramentas, clique e mantenha
pressionado o botão esquerdo do mouse e arraste a barra para o local desejado.

Schneider Electric- Treinamento- Junho/2009 59


Ferramentas de Edição
Formatação e Comentários:
Foi adicionada também uma barra de ferramentas de formato ao Editor do
Cicode para formatar e converter linhas de código em comentários..

Schneider Electric- Treinamento- Junho/2009 60


Ferramentas de Edição
Procedimento para converter código em comentários:
Marque as linhas de código que deseja converter em comentários e pressione
o botão adequado. Por exemplo, para converter em comentários várias linhas,
marque o código conforme mostrado abaixo:

Schneider Electric- Treinamento- Junho/2009 61


Ferramentas de Edição
Barra indicadora de marcadores e breakpoints:
Os marcadores e breakpoints são ferramentas úteis que se usam ao modificar
e depurar códigos. A barra indicadora de marcadores e breakpoints está
colocada na lateral esquerda da janela de código.

Marcador

BreakPoint

Schneider Electric- Treinamento- Junho/2009 62


Ferramentas de Funções
Lista de Funções no Cicode e no CiVBA:
Agora está disponível uma lista de funções que dependem do contexto (Cicode
ou VBA).

Schneider Electric- Treinamento- Junho/2009 63


Ferramentas de Funções

1.Mensagem Automática de Intellisense

Funções do Cicode Funções do CitectVBA

Schneider Electric- Treinamento- Junho/2009 64


Ferramentas de Edição
Mensagem Automática de Intellisense:
Esta mensagem automática também será mostrada por ocasião da digitação
do nome correto da função e do primeiro parênteses na área edição conforme
mostrado abaixo:

Schneider Electric- Treinamento- Junho/2009 65


Preferências
Troca da aparência da janela de código:
A janela de código pode ser personalizada de forma a refletir suas preferências
quando visualizando o código. Ao clicar com o botão direito do mouse na área de
código e selecionar Preferences no menu, aparecerá o quadro de diálogo
mostrado abaixo:

Schneider Electric- Treinamento- Junho/2009 66


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
Programa: ● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 67
Funções do Cicode

Schneider Electric- Treinamento- Junho/2009 68


Objetivos do Capítulo
Neste capítulo você irá aprender:
●Escrita de funções Simples;
●Elementos das funções;
●O que são funções do tipo Public e Private;
●Declarações de Funções;
●O que são funções do tipo Void e Return;
●Como Atribuir nomes as Funções;
●Variáveis de Cicode;
●Conversão e designação de formato as variáveis do Cicode;
●Sobre Arrays no Cicode;
●Como utilizar comentários;
●Arquivos de Inclusão.

Schneider Electric- Treinamento- Junho/2009 69


Escrevendo Funções Simples
As funções do Cicode podem ter diferentes propósitos. Algumas são
simples, criadas de forma a substituir um comando ou expressão muito
longa.

Execute
IF COUNTER < 100 THEN COUNTER =
Command COUNTER + 1; ELSE COUNTER = 0; END;

Execute
IncContador();
Command

Schneider Electric- Treinamento- Junho/2009 70


Escrevendo Funções Simples
A função é escrita em um arquivo de Cicode:

SINTAXE DESCRIÇÃO
Scope Public ou Private
FUNCTION Informa ao Compilador onde começar a
compilar a função
IncContador() Que função será chamada
IF CONTADOR < 100 THEN O código que será executado quando a função
é chamada
CONTADOR = CONTADOR + 1;
ELSE
CONTADOR = 0;
END Termina a Declaração IF
END Isto indica ao compilador o final do código

Schneider Electric- Treinamento- Junho/2009 71


Sintaxe das Funções

OLA
Levante()
SE dito ENTÃO
Levante;
SENÃO
Permaneça sentado;
TERMINADO
TCHAU

Schneider Electric- Treinamento- Junho/2009 72


Elementos das Funções
As funções podem conter quatro elementos básicos, a saber:
●Scope - Escopo
●Declaration - Declaração
●Name – Nome da Função
●Statement - Declarações da Função

Schneider Electric- Treinamento- Junho/2009 73


Funções Public e Private (Scope)

Scope (PUBLIC or PRIVATE)

FUNCTION

NomeFuncao()

Statement;

END

Schneider Electric- Treinamento- Junho/2009 74


Declarando Funções

Scope

FUNCTION

Par NomeFuncao()
companheiro
Statements;

END

Você deve finalizar sua função com a


palavra END

Schneider Electric- Treinamento- Junho/2009 75


Nomeando Funções

Você pode utilizar até 32 caracteres para nomear suas funções.

Você pode utilizar qualquer nome válido exceto palavras reservadas.

O compilador não diferencia letras maiúsculas de minúsculas.

SCOPE

FUNCTION

NomeFuncao()

Statements;

END

Schneider Electric- Treinamento- Junho/2009 76


Declarações
PUBLIC

FUNCTION

DeclaracaoExemplo ()

IF STATUS_BMB_PASTA THEN

PROMPT(“Bomba Pasta Ligada”);


Par
companheiro As
ELSE declarações
As declarações

PROMPT(“Bomba Pasta Desligada”);

END

END

Schneider Electric- Treinamento- Junho/2009 77


Funções do tipo Void
PUBLIC

FUNCTION

ExemploVoid()

IF STATUS_BMB_PASTA THEN

Prompt(“Bomba Pasta Ligada”);

ELSE

Prompt(“Bomba Pasta Desligada”)’

END

END

Para chamar esta função nós poderíamos executar um comando tal


como o mostrado abaixo: Execute ExemploVoid();
Schneider Electric- Treinamento- Junho/2009
Command 78
Variáveis do Cicode
Uma variável do Cicode representa uma posição de memória nomeada
onde dados podem ser armazenados. São similares aos PLC’s no que
tange a forma de armazenamento de variáveis.

Registros PLC Memoria Computador

Valor Nivel_Silo iMedia


Valor Temp_Forno rArea

Valor Tag_String sMeuNome

Schneider Electric- Treinamento- Junho/2009 79


Variáveis do Cicode
As variáveis do Cicode podem armazenar os seguintes tipos básicos
de dados:
- STRINGS;
- INTEIROS;
- REAIS;

Schneider Electric- Treinamento- Junho/2009 80


Variáveis do Cicode
Os tags de variáveis da base de dados são declarados mediante o
uso do formulário Variable Tags encontrado no Editor de Projetos
do Vijeo Citect.

Schneider Electric- Treinamento- Junho/2009 81


Variáveis do Cicode
Uma variável do Cicode pode ser definida como um dos seguintes três
tipos: GLOBAL, MODULE, e LOCAL. Por default, as variáveis são do
tipo MODULE, a menos que declaradas dentro das funções.

Esta é a sintaxe quando declarando variáveis:

SCOPE TIPODADO NOME = VALOR INICIAL COMENTÁRIO


ReturnTipoDado
Este é o escopo da
FUNCTION variável não o escopo
da Função. Não
NomeFuncao() confunda os dois.
Statement;
RETURN Valor;
END

Schneider Electric- Treinamento- Junho/2009 82


Variáveis do Cicode
Variáveis Globais
Uma variável Global do Cicode pode ser compartilhada entre todos os Cicode
files existentes no sistema (bem como entre projetos include). Elas não podem
ser acessadas em páginas ou base de dados (por ex., Alarm.dbf)

GLOBAL STRING sPaginaDefault ="Mimic";


EXEMPLO:
INT
FUNCTION
ExemploGlobal(STRING sPagina)
INT iStatus;
iStatus = PageDisplay(sPagina);
IF iStatus <> 0 THEN
PageDisplay(sPaginaDefault);
END
RETURN iStatus;
END

Schneider Electric- Treinamento- Junho/2009 83


Variáveis do Cicode
Variáveis Modulares – Module
Uma variável do tipo Module do Cicode é específica ao arquivo do Cicode na
qual foi declarada. Isto significa que ela pode ser utilizada por qualquer função
naquele arquivo, mas não por uma função de outros arquivos. Por default, as
variáveis do Cicode são definidas como Module (Modulares).
Conseqüentemente, o prefixo não é requerido, mas deve ser colocado por
melhorar a visualização.
MODULE STRING sPaginaDefault = "Mimic";

Schneider Electric- Treinamento- Junho/2009 84


Variáveis do Cicode
Variáveis Modulares – Module
EXEMPLO:
MODULE STRING sPaginaDefault = "Mimic";
PUBLIC
INT
FUNCTION
MostraMinhaPagina(STRING sPagina)
INT iStatus;
iStatus = PageDisplay(sPagina);
IF iStatus <> 0 THEN
PageDisplay(sPaginaDefault);
END
RETURN iStatus;
END

PUBLIC
FUNCTION
MostraMinhaPagina()
PageDisplay(sPaginaDefault);
END
Schneider Electric- Treinamento- Junho/2009 85
Variáveis do Cicode
Variáveis Locais
Uma variável Local do Cicode é apenas reconhecida pela Function dentro da
qual ela foi declarada e apenas pode ser utilizada por aquela função. Você deve
declarar as variáveis locais antes de utilizá-las.

EXEMPLO:
PUBLIC
INT
FUNCTION
ExemploLocal(INT a, INT b)
INT iMedia
iMedia = (a + b) /2;
RETURN iMedia
END

Schneider Electric- Treinamento- Junho/2009 86


Padrões Quando Atribuindo Nomes para
Variáveis

Cada tipo de dado da variável necessita ser nomeado quando da


declaração da variável. A seguinte convenção é adotada:
INT (32 bits) i Indices, contador de loops
BOOLEAN (32 bits) i True/False
REAL (32 bits)r Variáveis reais
STRING (255 bytes) s Variáveis do tipo string

Schneider Electric- Treinamento- Junho/2009 87


Tags de Variáveis
Para fazer uso de uma variável da base de dados, especifique o nome
do tag da seguinte form:

<Tag>

Schneider Electric- Treinamento- Junho/2009 88


Conversão e Designação de formato para
as variáveis do Cicode
Tipos de dados
●Os tipos de dados são gerenciados de forma bastante rígida no Cicode. Se
desejamos introduzir números mediante a função Input() e utilizamos estes
números em um cálculo, é necessário trocar o tipo de dado de um STRING para
um número INTEIRO ou REAL. O motivo é que a função Input() devolve dados
do tipo STRING. Não se pode utilizar STRINGS nos cálculos matemáticos. Por
outro lado, se desejamos mostrar o valor de um número INTEIRO ou REAL em
um relatório, precisamos trocar seu tipo para STRING.
●Este processo denomina-se Conversão. O Vijeo Citect proporciona quatro
funções para converter números inteiros e reais para string e vice versa.
TIPO FUNÇÃO
IntToStr() Converte um número inteiro em uma STRING
RealToStr() Converte um número real em uma STRING
StrToInt() Converte uma string em um número inteiro
StrToReal() Converte uma string em um número real

Schneider Electric- Treinamento- Junho/2009 89


Conversão e Designação de formato para
as variáveis do Cicode
Tipos de dados
Também está disponível uma série de funções de data e hora que convertem
as variáveis de hora em STRINGS para sua visualização.

TIPO FUNÇÃO
TimeToStr() Converte uma variável de hora e data em uma
string
StrToDate() Converte uma string de data em uma variável de
hora e data

Schneider Electric- Treinamento- Junho/2009 90


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
Programa: ● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 91
Executores Condicionais

Schneider Electric- Treinamento- Junho/2009 92


Objetivos do Capítulo

Neste capítulo você irá aprender sobre:


●Os quatros executores condicionais:
●IF
●FOR
●WHILE
●SELECT CASE.

Schneider Electric- Treinamento- Junho/2009 93


Declaração IF
A declaração IF é utilizada para executar uma seção do código
baseada no resultado de algum teste condicional. Existem dois formatos
de declaração IF; IF THEN ou IF THEN ELSE. A sintaxe para ambas
está mostrada abaixo:
IF Expressão THEN
Statement(s);
END

- ou -

IF Expressao THEN
TRUE Statement(s);
ELSE
FALSE Statement(s);
END
Schneider Electric- Treinamento- Junho/2009 94
FOR Loop
O loop FOR é utilizado para executar um conjunto de declarações um
determinado número de vezes.
FOR Variável = Expressao1 TO Expressao2 DO
Statement(s);
END
Onde:
Variavel >. é uma variável definida utilizada para contar o número de
vezes que a declaração foi executada
Expressao1 > é o valor de contagem inicial
Expressao2 > é o valor de contagem final

Schneider Electric- Treinamento- Junho/2009 95


FOR Loop
Exemplo:

STRING ArrayA[5]="Este","e","um","String","Array";
INT
FUNCTION
MostraArray()
INT Contador;
FOR Contador = 0 TO 4 DO
Prompt(ArrayA[Contador]);
Sleep(2);
END
RETURN 0;
END

Schneider Electric- Treinamento- Junho/2009 96


Loop WHILE
O loop WHILE é utilizado para executar declarações de forma repetitiva
enquanto a declaração condicional é TRUE (1).

WHILE Expressao DO
Statement(s);
END

Schneider Electric- Treinamento- Junho/2009 97


Loop WHILE
Exemplo:
FUNCTION AnimaMaq()

INT WAIT_TIME = 1000; ! numero ms chamadas Animações


INT hTask1 = -1; !handle Task Animaçoes Maquina1
WHILE TRUE DO

hTask1 = TaskNew("AnimacoesMaq1","",4+8);

IF hTask1 = <> -1 THEN


TraceMsg(“Task AnimacoesMaq1 criada com sucesso!”);
ELSE
TraceMsg(“Falha na criação da Task
AnimacoesMaq1!”);
END
SleepMS(WAIT_TIME);
END
END
Schneider Electric- Treinamento- Junho/2009 98
A Declaração SELECT CASE
A declaração SELECT CASE executa um dos diversos grupos de declarações,
dependendo do resultado de uma expressão. As declarações SELECT CASE
constituem a maneira mais eficiente de se escrever códigos que de outra forma
teriam de ser escritos com declarações encadeadas do tipo IF THEN.
Exemplo:
SELECT CASE Expressao
CASE CaseExpressao1 Onde:

Statement(s); Expressao > Expressão a ser testada


CaseExpressao1 > Teste para a primeira condição
CASE CaseExpressao2
CaseExpressao2 > Teste para a segunda condição
Statement(s);
CaseExpressaoN > Teste para a enézima condição
------------------------ CASE ELSE > Teste de execução caso nenhuma das
CASE CaseExpressaoN condições anteriores tenha sido encontrada

Statement(s);
CASE ELSE
Statement(s);
END SELECT

Schneider Electric- Treinamento- Junho/2009 99


A Declaração SELECT CASE
Se a Expressao iguala-se a qualquer CaseExpressao, as declarações que se seguem a aquela

condição CASE são executadas até a próxima condição CASE ou (para a última condição) até a END

SELECT.

Se a Expressao iguala-se a CaseExpressao em mais de uma condição CASE, apenas as declarações

que se seguem após a primeira serão executadas.

A condição CASE ELSE é utilizada para indicar as declarações que serão executadas se nenhuma

igualdade é encontrada entre Expressao e qualquer das CaseExpressao.

Quando não existir a declaração CASE ELSE e nenhuma igualdade é encontrada entre Expressao e

qualquer das CaseExpressao, a execução continua na próxima declaração do Cicode seguinte a END

SELECT.
Schneider Electric- Treinamento- Junho/2009 100
Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
Programa: ● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 101
Outras funções Cicode

Schneider Electric- Treinamento- Junho/2009 102


Objetivo do Capítulo

Neste capítulo você ira aprender


●Funções do Tipo Return;
●Depuração de código;
●Arrays;
●Comentários.

Schneider Electric- Treinamento- Junho/2009 103


Funções do Tipo Return
As funções ou expressões do tipo Return retornam informação para a
função de chamada ou para a linha de comando.

A sintaxe da função do tipo Return é mostrada abaixo:


Isto indica o tipo de
dado retornado pela
SCOPE função; INT, REAL ou
STRING
TipoDadoRetornado
FUNCTION
Par NomeFuncao({Arg1DataType Arg1} {=DefaultValue}, ...,
Companheiro
Statement(s);
Este é o dado que
RETURN RetornaDado;
será retornado
END

Schneider Electric- Treinamento- Junho/2009 104


Funções do Tipo Return
Exemplo:

PUBLIC
INT
FUNCTIONEsta é uma variável local já vista anteriormente.
ExemploReturn (INT a, INT b)
INT iMedia;
iMedia = (a + b) /2
RETURN iMedia; Esta é uma
variável local já
END vista
anteriormente.

Schneider Electric- Treinamento- Junho/2009 105


Funções do Tipo Return
A função recebe o valor de dois números inteiros e calcula a média entre eles.
Para chamar esta função, você pode utilizar a seguinte expressão:

Numeric
expression ExemploReturn(TAG1 , TAG2);

Onde TAG1 e TAG2 são tags inteiros. O valor mostrado na página gráfica será
a média entre estes dois tags.
Funções do tipo Return proporcionam maior flexibilidade que uma função do
tipo Void No exemplo seguinte, a função coloca informação em um tag
específico denominado Recipe.

Schneider Electric- Treinamento- Junho/2009 106


Arrays
Um array é uma coleção de variáveis do mesmo tipo de dado, organizados em
forma de uma lista ou tabela. Você atribui nomes e declara um array da mesma
forma que qualquer outro tipo de variável. Você pode então fazer referência a
cada elemento no array da mesma forma que qualquer outra variável fazendo
uso de um index para indicar sua posição no array.

UNIT A UNIT B UNIT C UNIT D

Schneider Electric- Treinamento- Junho/2009 107


Sintaxe
Os arrays possuem a seguinte sintaxe:

TipodeDado Nome[tamanho]=Valores;

Onde:
TipodeDado >> pode ser INT, REAL ou STRING
Nome >> é o nome do array
[Tamanho] >> é o tamanho do array
=Valores >> são os valores default para o array.

Schneider Electric- Treinamento- Junho/2009 108


Sintaxe
STRING StrArray[5];
Você deve sempre declarar o tamanho do array (o numero de
elementos que o array contém) como no exemplo abaixo:
STRING StrArray[5];

Schneider Electric- Treinamento- Junho/2009 109


Inicializando um Array
Quando você declara um array, você pode (opcionalmente) inicializar
seus elementos individuais para valores iniciais (de startup) como
mostrados abaixo:

STRING ArrayA[5]="Este","e","um","String","Array";
Este conjunto inicializa os seguintes elementos:
ArrayA[0]="Este"
ArrayA[1]="e"
ArrayA[2]="um"
ArrayA[3]="String"
ArrayA[4]="Array"

Schneider Electric- Treinamento- Junho/2009 110


Dimensões de Arrays
Os arrays podem também possuir mais de uma dimensão. Se você
deseja utilizar mais de uma dimensão, a sintaxe abaixo mostra como
fazê-lo:

TipoDado Nome[Dimensao1Tamanho][Dimensao2Tamanho][Dimensao3Tamanho] =Values;

Quando você inicializa seu array, as alternativas abaixo são aplicáveis:


STRING StrArray[5]; ! lista
REAL Resultado[5][2]; ! 2-D table
INT IntArray[4][3][2];! 3-D table

Schneider Electric- Treinamento- Junho/2009 111


Utilizando Arrays
Você não pode declarar um array local a uma função. Eles apenas
podem ser Modulares ou Globais (por ex., no início de um arquivo do
Cicode).
Quando fazendo referência ao array dentro de sua função, você não
deve exceder o tamanho do conjunto que você declarou para o array. O
seguinte exemplo poderia causar um erro fatal:
STRING StrArray[5];
Assim, se você tenta fazer uso da seguinte declaração
StrArray[10] = “Jorge”;

Schneider Electric- Treinamento- Junho/2009 112


Utilizando Arrays

O compilador permite armazenagem para 05 strings. Atribuindo um

valor para o 11o elemento, você estaria fazendo com que a string fosse

armazenada fora dos limites do array, podendo estar sobrescrevendo

outro valor armazenado na memória.

Você não pode passar um array inteiro para uma função do Cicode.

Schneider Electric- Treinamento- Junho/2009 113


Maximum Size of Cicode Array
Article number: Q1128
Updated on: 20/02/2002
For Citect versions: 1.x  2.x  3.x  4.x  5.x
Summary
Question: What is the maximum size of a Cicode array variable?
Solution
The total size of a Cicode array is limited to 64k. The number of acceptable elements will
therefore depend on the size of each element in the array. For INT and REAL data types,
each element is 4 bytes plus some overhead -- this allows for a maximum of 15,359
elements in the array (16,364 elements in Vijeo Citect v1.x and v2.x).
Cicode STRINGs in an array are 128 bytes each plus overhead.  CitectSCADA versions
before V5.10 allowed up to 479 STRINGs in each array (512 elements in Vijeo Citect v1.x
and v2.x). 
However, after Version 5.10 this changed. Now CitectSCADA supports Cicode STRINGs
in an array that are 255 bytes each plus overhead. This means that now only 250 STRINGs
are supported in each array.
OBJECT arrays are not supported at this time. There is no limit to the total number of
Cicode variables. You can have many large arrays as long as each array is less than 64k in
size.

Schneider Electric- Treinamento- Junho/2009 114


Comentários
A utilização de comentários constitui uma boa prática quando
programando em Cicode. Os comentários permitem a você rapidamente
entender como a função trabalha na próxima vez que você (ou outro
projetista) precisar modificá-la.
O compilador do Cicode reconhece os seguintes comentários estilo
linguagem C e C++:

! Um comentário de linha simples


WHILE DevNext(hDev) DO
Contador = Contador + 1; ! Comentário dentro da linha
END

/* Um bloco de comentário no estilo da linguagem C pode-se


estender pro diversas linhas. Blocos de comentários devem iniciar e
terminar com um delimitador. Entretanto, delimitadores no início de cada
linha são opcionais */

// Uma barra dupla implica em um comentário no estilo C++ :


Schneider Electric- Treinamento- Junho/2009 115
Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
Programa: ● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 116
Cicode Debugger

Schneider Electric- Treinamento- Junho/2009 117


Objetivo do Capítulo

Neste capítulo você ira aprender


●Como iniciar o Debugger;
●Sobre as opções de Debug;
●A depurar um código do Cicode.

Schneider Electric- Treinamento- Junho/2009 118


O Ambiente do Editor do Cicode

1.No Editor do Cicode, clique com o


botão direito do mouse em uma seção
vazia da barra de ferramentas. Marque a
opção Debug conforme mostrado abaixo:

Schneider Electric- Treinamento- Junho/2009 119


O Ambiente do Editor do Cicode

2.Aparecerá a seguinte barra de


ferramentas na barra de menus:

Schneider Electric- Treinamento- Junho/2009 120


O Ambiente do Editor do Cicode
3.Abra o arquivo Debug.ci.
4.Execute o projeto e acesse a página pizza;
5.Execute a função GetPizzaInfo() pressionando o botão Pizza Info
na página. Você verá que nesta função existem dois lugares onde é
necessário interação do usuário.
6.No Editor do Cicode, clique no botão Toggle Debuging na barra de
ferramentas. Observe um inseto verde no canto inferior direito de sua
tela indicando ativação do modo depurador.

Schneider Electric- Treinamento- Junho/2009 121


O Ambiente do Editor do Cicode

7.Coloque um breakpoint na
barra indicadora situada a
esquerda da linha que se mostra
a seguir.

Schneider Electric- Treinamento- Junho/2009 122


O Ambiente do Editor do Cicode
8.Selecione no menu View|Stack Window. Nesta janela se mostra
o nome da função, os valores dos argumentos passados para a
função e todas as variáveis de stack(variáveis locais).
9.Volte a pagina de Treinamento e clique no botão Pizza Info.
10.O Editor do Cicode piscará na barra de tarefas. Abra o Editor do
Cicode e verá que apareceu uma flexa amarela sobre o breakpoint
inserido anteriormente. Ela indica a seguinte linha de código que
será executada.

Schneider Electric- Treinamento- Junho/2009 123


O Ambiente do Editor do Cicode

11.Também verá uma lista das


variáveis de memória e seus
valores atuais na Stack Window.

Schneider Electric- Treinamento- Junho/2009 124


O Ambiente do Editor do Cicode

12.Clique no botão Step Into


na barra de ferramentas Debug.
Isto executará a linha seguinte do
código. Na linha seguinte se utiliza
a função Input(). Trata-se de uma
função de bloqueio (blocking
function) e não permitirá que o
subprocesso continue até que
haja uma ação do usuário. Volte
ao runtime do Vijeo Citect e
introduza um valor para Pizza
Number, clique no botão OK.

Schneider Electric- Treinamento- Junho/2009 125


O Ambiente do Editor do Cicode

13.Retorne ao Editor do Cicode


e olha a Stack Window. O número
introduzido será mostrado na
variável sPizzaNumber.

Schneider Electric- Treinamento- Junho/2009 126


O Ambiente do Editor do Cicode

14.Clique novamente no botão


Step Into na barra de
ferramentas Debug para executar
a linha seguinte do código. Esta
linha designa um número de
identificadro de dispositivo.

Schneider Electric- Treinamento- Junho/2009 127


O Ambiente do Editor do Cicode

15.Repita passo a passo pelas


instruções até que as linhas que
atribuem valores as variáveis
sPizzaName e sPizzaPrice sejam
executadas.

Schneider Electric- Treinamento- Junho/2009 128


O Ambiente do Editor do Cicode

16.Clique no botão Continue


para executar o restante do
código. Quando se executa Pizza
information Message será
necessário novamente retornar a
página Treinamento para confirmar
o quadro de mensagem
pressionando o botão OK. Isto
funciona desta forma porque a
função Message() também é uma
Blocking Function e por isto requer
uma ação do usuário antes que o
subprocesso possa continuar.

Schneider Electric- Treinamento- Junho/2009 129


Passo Seguinte – Avançando pelo código
No Editor do Cicode são disponibilizadas as seguintes ferramentas para controlar o
avance através das funções:

Passo a passo por instruções: Avança o subprocesso do cicode atual uma instrução.

Se a instrução chama uma função definida pelo usuário, o depurador localizará a definição

desta função e entrará nela.

Passo a passo procedimento: Avança o subprocesso do cicode atual uma instrução.

Se a instrução chama uma função definida pelo usuário, o depurador passará por cima

dela (a função não se expandirá).

Passo a passo para sair: Avança até o final da função atual e volta. Se não existe

nenhuma função a ser chamada, o processo será terminado.

Schneider Electric- Treinamento- Junho/2009 130


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
Programa: ● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 131
Apêndice A – Técnicas de
Programação Estruturada

Schneider Electric- Treinamento- Junho/2009 132


Objetivos do Apêndice

Ao final deste capítulo você aprenderá:


●Como utilizar pseudocódigos ;
●Como utilizar diagramas de fluxo.

Schneider Electric- Treinamento- Junho/2009 133


Diagramas Lógicos de Fluxo
Blocos de Decisão

Contagem é > 10?

Blocos de Execução

Faça Contagem = 10

Caminhos Condicionais

SIM

Caminhos não Condicionais

Schneider Electric- Treinamento- Junho/2009


Loop retorn 134
Diagramas Lógicos de Fluxo
Exemplo A:
Valor

SIM
Valor é > 10? Prompt “Range é inválido”

NÃO

SIM
Valor é < 1? Prompt “Range é inválido”

NÃO

Retorna o valor

Schneider Electric- Treinamento- Junho/2009 135


Diagramas Lógicos de Fluxo
Exemplo B:

Contagem = 0

SIM
Contagem é > 60? Feche o formulário

NÃO

SIM
Botão Pressionado? Executa a tarefa

NÃO

Contagem = Contagem+1

Schneider Electric- Treinamento- Junho/2009 136


Conclusão
Como os exemplos puderam demonstrar, a utilização de pseudocódigos ou

diagramas de fluxo auxiliam os programadores a construir um código bem

estruturado e fácil de interpretar para depuração e manutenção.

Sempre que um código é necessário e envolve operadores/declarações

condicionais, é recomendado que os programadores gastem algum tempo com o

projeto dos pseudocódigos ou com a construção do diagrama lógico de fluxo.

Schneider Electric- Treinamento- Junho/2009 137


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
Programa: ● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 138
Apêndice B – Guia de
Programação no Cicode

Schneider Electric- Treinamento- Junho/2009 139


Objetivos do Apêndice

Ao final deste capítulo você estará apto a:


●Utilizar a convenção de nomes;
●Entender e utilizar o formato de biblioteca de Arquivos e funções;
●Entender e utilizar o formato de declarações de programa;
●Praticar uma programação defensiva e procurar por erros quando
depurando.

Schneider Electric- Treinamento- Junho/2009 140


Introdução
Este apêndice tem o como propósito ensinar os padrões da linguagem
Cicode no sentido de aumentar a uniformidade e melhorar a manutenção quando
desenvolvendo rotinas em Cicode independentemente do(s) autor(es).

A manutenção à nível de código é otimizada primeiramente assegurando-se


uma documentação adequada através da utilização de cabeçalhos explicativos
nos módulos e finalmente pelo formato do código, que tem sua leitura e
interpretação melhorada de forma sensível.
A uniformidade do código fonte por si só já denota um produto bem
desenvolvido por um time ao invés de um grupo de indivíduos. Isto encoraja os
programadores de manutenção a tomar um caminho de disciplina similar quando
fazendo upgrades.

Schneider Electric- Treinamento- Junho/2009 141


Definições e Convenções de Nomes
Variáveis
Nome de Variáveis
●Poderia ter uma letra minúscula como prefixo de identificação (veja lista
abaixo)
●Pode possuir até três palavras concatenadas, cada uma delas começando
por letra maiúscula.

Tipo Prefixo Utilizado para


INT i Indexador, contador loop
INT n Numero de contagens
INT h handle
INT b Variáveis booleanas (TRUE/FALSE)
REAL r Variáveis do tipo real
STRING s Variáveis do tipo string

Exemplo: nTipoTendencia, rPeriodo, sNomeArquivo


Schneider Electric- Treinamento- Junho/2009 142
Declaração de Variáveis
Uma declaração de variável possui até 5 (cinco) partes. Cada parte é
separada por pelo menos um TAB (oito caracteres espaço) e todas as
partes devem ser alinhadas verticalmente em uma declaração. Se uma
parte de uma declaração está ausente, ela deve ser deixada em branco.
A próxima parte irá iniciar no mesmo lugar se não houvesse a ausência.
A primeira parte é o escopo da variável. No momento deixaremos em
branco;
A segunda parte define o tipo padrão de variável do Cicode;
A terceira parte é o nome da variável. Nomes de variáveis devem ser tão
descritivos quanto possíveis considerando o propósito geral da mesma;
A quarta parte é o valor inicial da variável;

[scopo] [tipo] [nome] [=<valor inicial>] [comentário]

[comentário]A quinta parte é um comentário opcional que fornece um


breve comentário da variável;

Schneider Electric- Treinamento- Junho/2009 143


Variáveis do Cicode
Variáveis Locais (Variáveis de Funções):
Estas variáveis são declaradas no começo de uma função e apenas
podem ser utilizadas dentro desta função. Elas são destruídas quando a
função termina sua execução e retorna ao programa principal. A
inicialização destas variáveis constitui uma boa prática de programação:
INT iArquivo = 0;
STRING sNome = “”;
INT bSucesso = FALSE;

Schneider Electric- Treinamento- Junho/2009 144


Variáveis do Cicode
Variáveis Globais (Variáveis de Bibliotecas, Variáveis de
Arquivos):
Estas variáveis são privativas de arquivos de bibliotecas. Eles devem
ser declarados no começo do arquivo e podem ser utilizadas em
quaisquer (ou todas) funções dentro do arquivo. A letra “g” (um prefixo
extra) é utilizada para identificar as variáveis globais. Elas devem
sempre ser inicializadas.
INT ghForm = -1;
STRING gsNomePagina = “Loop”;

Schneider Electric- Treinamento- Junho/2009 145


Variáveis do Cicode
Constantes:
No Cicode não existe o equivalente a #defines da Linguagem C ou um
tipo que irá forçar variáveis se tornarem constantes (variáveis do tipo
apenas leitura). Entretanto, a convenção adotada permite uma fácil
identificação das mesmas.
1.Devem possuir o prefix “c”;
2.Devem ser declaradas e inicializadas no início do arquivo de
biblioteca e nunca poderão receber outro valor;
INT cTendTipoPeriodic = 1;
INT cTendTipoEvent = 2;

STRING cNomePagina = “Mimic”;


ou
STRING csNomePagina = “Mimic”;

Schneider Electric- Treinamento- Junho/2009 146


Variáveis do Cicode
Variable Tags:
Tags de variáveis que foram definidos na base de dados (no
formulário Variable Tags) podem ser utilizados em todas as funções nos
arquivos de biblioteca. Os tags de variáveis são normalmente com letras
maiúsculas e os usuários poderiam utilizar seu próprio padrão para
defini-las.

Schneider Electric- Treinamento- Junho/2009 147


Funções
1.A primeira parte define o tipo de retorno da função. Deve ser colocado em uma linha
separada;

2.A segunda parte consiste da palavra chave FUNCTION, que também deve ser inserida
em uma linha em separado.

3.A terceira parte aparece o nome da função. Os nomes das funções devem possuir até
32 caracteres. Você pode utilizar qualquer nome valido, exceto palavras reservadas e deve
inserir em uma linha em separado.

4.A quarta parte é a lista de argumentos. Os argumentos são separados por vírgulas e
podem possuir valores iniciais (default). A lista de argumentos está normalmente na mesma
linha do nome da função, mas múltiplas linhas de argumentos são aceitáveis quando
facilitam a leitura.

5.Na quinta parte aparece às declarações, uma por linha.

6.Na sexta parte aparece a palavra chave END, que determina o final da função, sendo
também inserida em uma linha em separado.
Schneider Electric- Treinamento- Junho/2009 148
Funções – Exemplo
FUNCTION
PlotInit()

<Declarações>
END
INT
FUNCTION
PlotOpen(STRING sName, INT nMode)
INT hPlot = BAD_HANDLE;
.
hPlot = …..;
.
RETURN hPlot;
END

STRING
FUNCTION
WasteInfoName(INT nType, INT nMode)

STRING sName = “Sydney”;


.
sName = …..;
.
RETURN sName;
END
Schneider Electric- Treinamento- Junho/2009 149
Formato de Arquivos de Biblioteca e
Funções
//** Arquivo: <nome do arquivo.CI>
//**
//** DESCRIÇÃO: <descrição do arquivo>
//**
//** NOTAS: <informações importantes ou comentarios sobre o conteudo>
//**
//********************* CONSTANTES**************************
<constantes> //<comentários (opcional>

//**************** VARIÁVEIS GLOBAIS ***********************


<variáveis globais> //<comentários (opcional)>

//*********************************************************
<funções>
Schneider Electric- Treinamento- Junho/2009 150
Funções
//** FUNCTION : <nome da Função>
//**
//** DESCRIÇÃO : <Sugestão da aplicação, operação
//** e outros detalhes importantes>
//** REVISÃO
//** DATA POR COMENTARIOS
//** <data> <autor> <commentarios aplicáveis>
//**
//** VALOR RETORNADO: < Descrição dos possíveis valores //**
retornáveis>
//**
//** NOTAS:

Schneider Electric- Treinamento- Junho/2009 151


Formato de Declarações de Programa
Formatando declarações Simples
Apenas um item deve ser declarado por declaração, não deve haver
variáveis separadas por vírgulas.
Tabulação de 8 espaços deve ser utilizado para declarações.

Por exemplo;
INT hFile,hForm; // ERRADO

INT hFile; // CERTO


INT hForm; // CERTO

Schneider Electric- Treinamento- Junho/2009 152


Formato de Declarações de Programa
Formatando Declarações Executáveis
Declarações são colocadas em novas linhas separadas por um TAB. Não é
aceitável ter mais de uma declaração por linha.

Por exemplo:
hFile = -1; hForm = -1; // ERRADO
hFile = -1; // CERTO
hForm = -1; // CERTO

Schneider Electric- Treinamento- Junho/2009 153


Formato de Declarações de Programa
Formatando Expressões
Quando uma expressão forma uma declaração completa, ela deve,
como qualquer outra declaração ocupar uma ou mais linhas. Operadores
binários devem ser separados por espaços
i= i*10+c-'0'; // ERRADO
i = i * 10 + c - '0'; // CERTO

Schneider Electric- Treinamento- Junho/2009 154


Formato de Declarações de Programa
Formatando Expressões
Quando uma expressão está colocada entre parênteses, o primeiro
símbolo dela deve ser colocado encostado ao parêntese. O parêntese
de fechamento deve ser inserido imediatamente após o último caractere
da expressão.
a = b * ( c - d ); // ERRADO
a = b * (c - d); // CERTO

Schneider Electric- Treinamento- Junho/2009 155


Formato de Declarações de Programa
Formatando Expressões
Não deixar espaços entre os parênteses e as aspas e os argumentos.

DisplayText( "hello" ); // ERRADO


DisplayText("hi^n"); // CERTO

Schneider Electric- Treinamento- Junho/2009 156


Formato de Declarações de Programa
Formatando Expressões
Quando utilizando vírgulas como operadores ou separadores, as
mesmas deverão ser inseridas logo depois do símbolo que a antecede.
Um espaço deverá separá-la do próximo símbolo.

DevSeek(hDev ,Offset); // ERRADO


DevSeek(hDev, Offset); // CERTO

Schneider Electric- Treinamento- Junho/2009 157


Comentários
●A maior parte deste documento está concentrada em formatação dirigida na

melhoria da interpretação e leitura de códigos. A suposição é de que códigos bem

documentados são mais fáceis de serem entendidos. Os comentários não

melhoram a leitura do código, mas ajudam bastante no entendimento e na

manutenção.

●Comentários inseridos no meio do código tendem a criar uma massa densa de

texto atrapalhando o fluxo do código. Os comentários devem todos ser inseridos

nas notas do cabeçalho da função. Pequenos comentários de uma linha são

aceitáveis para explicar algumas pequenas partes do código que porventura

poderiam ficar perdidos nos comentários do cabeçalho.


Schneider Electric- Treinamento- Junho/2009 158
Programação Defensiva
Procure se assegurar sempre que seu código não irá nunca produzir

alarmes de hardware não explicáveis;

Sempre cheque por divisões por zero;

Sempre cheque para que os índices dos Arrays não saiam do range

especificado;

Cheque se os argumentos de fontes externas são válidos;

Schneider Electric- Treinamento- Junho/2009 159


Programação Defensiva
Cheque se terminações de loop são óbvios e alcançáveis;

Nunca escreva um código duas vezes.

O Cicode é uma linguagem multitask. Diversas tarefas (comandos,

expressões e tarefas criadas pela função TaskNew) podem ser

executadas simultaneamente. É essencial que o número de tarefas

rodando em um dado ponto no tempo seja minimizado.

Schneider Electric- Treinamento- Junho/2009 160


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
Programa: ● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 161
Apêndice C – SQL,Vijeo Citect e
ODBC

Schneider Electric- Treinamento- Junho/2009 162


Objetivos do Apêndice

Ao final deste apêndice você terá uma boa informação sobre:


Como se conectar a uma base de dados do Access através do Vijeo
Citect via um driver ODBC.

Schneider Electric- Treinamento- Junho/2009 163


Setup da Base de Dados
Antes de conectar sua base de dados ao Vijeo Citect, você irá
necessitar fazer algum trabalho de configuração no Windows Control
Panel para criar uma fonte de dados (Data Source). Uma fonte de dados
é aquela com a qual o Vijeo Citect se comunica buscando e atualizando
dados no seu banco de dados.

Schneider Electric- Treinamento- Junho/2009 164


Setup da Base de Dados

Schneider Electric- Treinamento- Junho/2009 165


Setup da Base de Dados

Schneider Electric- Treinamento- Junho/2009 166


Setup da Base de Dados

Schneider Electric- Treinamento- Junho/2009 167


Setup da Base de Dados

Schneider Electric- Treinamento- Junho/2009 168


Setup da Base de Dados

Schneider Electric- Treinamento- Junho/2009 169


Setup da Base de Dados

Schneider Electric- Treinamento- Junho/2009 170


Como se conectar a sua Base de Dados
via Vijeo Citect

O Vijeo Citect disponibiliza dois métodos de comunicação com sua


base de dados:
Através da utilização de Devices do Vijeo Citect e através da Classe
de funções SQL. A utilização de Devices é mais aconselhada para o uso
de relatórios logging automáticos.
As funções SQL por outro lado, fornecem controle absoluto e
flexibilidade sobre suas conexões e queries. A execução de um query via
um Device do Sistema é sempre mais lenta do que uma conexão via
uma função do SQL devido à natureza do Device.

Schneider Electric- Treinamento- Junho/2009 171


Utilizando a Classe de Funçoes SQL do
Cicode SQL class of functions

As funções SQLxxx() do Cicode fornecem os meios mais flexíveis de


você se comunicar com sua base de dados de dentro do Vijeo Citect.
Você tem controle completo sobre suas conexões. Através de uma
construção cuidadosa de suas queries e da utilização de índices, você
também terá a forma mais rápida de acessar grandes volumes de
dados.

Schneider Electric- Treinamento- Junho/2009 172


Exemplo Típico de uma Conexão e Query
INT
FUNCTION
GetNames()
INT hSQL;
STRING sName;
INT Status;
hSQL = SQLConnect( “DSN=Personnel” );
IF hSQL <> -1 THEN
Status = SQLExec( hSQL, “SELECT CNAME FROM FETISH” );
IF Status = 0 THEN
WHILE SQLNext( hSQL ) = 0 DO
sName = SQLGetField( hSQL, “CNAME” );
:
// Qualquer coisa voce deseje fazer com dado...
:
END;
SQLEnd( hSQL );
ELSE
Message( “Erro”, SQLErrMsg(), 48 );
END;
SQLDisconnect( hSQL );
ELSE
Message( “Error”, SQLErrMsg(), 48 );
END;
END
Schneider Electric- Treinamento- Junho/2009 173
Resumo Rápido de SQL
●Tabela FETISH

CNAME SURNAME PERSONID STARTDATE PET FETISH


Harold Heel 654 25-06-1994 Horse Hair
Jill Jumpy 854 14-05-1994 Jackal Jewels
Arnold Amore 935 12-06-1994 Aardvark Armpits
Catherine Crispy 367 15-08-1994 Cat Cold
David Dandy 746 21-07-1994 Deer Dandruff
Percival Point 153 07-07-1994 Python Pins
James Joint 946 08-05-1994 Jaguar Juice
Englebert Engine 479 10-06-1994 Elephant Earlobes
Tracy Titan 294 11-04-1994 Tortoise Toe Slime

Schneider Electric- Treinamento- Junho/2009 174


Resumo Rápido de SQL
●Tabela COUNTRY

PERSONID COUNTRY
654 Hungary
854 Jamaica
935 Australia
367 Cuba
746 Denmark
153 Portugal
946 Jamaica
479 Ethiopia
294 Thailand

Schneider Electric- Treinamento- Junho/2009 175


A Declaração SELECT
A declaração SELECT será provavelmente a declaração mais comum
que você irá utilizar. A sintaxe desta declaração possui diversas
variações proporcionando tornando-a poderosa. Na maioria dos casos,
entretanto, todas as suas necessidades de queries serão satisfeitas por
uma declaração SELECT com o seguinte formato:
SELECT <Fields>
FROM <Tables>
[WHERE <conditions>]

Schneider Electric- Treinamento- Junho/2009 176


Selecionando uma Tabela inteira
Existem duas formas para você selecionar uma tabela inteira. A
primeira foca uma variação da sintaxe da declaração SQL vista acima.
Se você desejar selecionar a tabela FETISH inteira, então você poderia
executar a declaração “SELECT FETISH” através da seguinte função do
Cicode:

SQLExec(hSQL, “SELECT * FROM FETISH”);


O outro método envolve a seleção de todos os campos da Tabela. Isto
poderia ser feito da seguinte forma:
SQLExec(hSQL ,“SELECT CNAME,SURNAME,PERSONID,
STARTDATE, PET, FETISH” + “FROM FETISH” );

Schneider Electric- Treinamento- Junho/2009 177


A basic conditional query
Quando querying base de dados é importante observar letras
maiúsculas/minúsculas.

SQLExec(hSQL ,“SELECT CNAME ”+ FROM FETISH ” + “WHERE


SURNAME = ‘Jumpy’ ” );
que resultaria em:
CNAME

Schneider Electric- Treinamento- Junho/2009 178


Queries baseadas em conjuntos de
dados- Operadores IN e NOT IN

Você pode fazer um query em uma base de dados procurando por


todos os registros nos quais os conteúdos dos campos se igualam a
valores de um conjunto de dados. Isto poderia ser configurado da
seguinte forma:
SQLExec(hSQL, “SELECT CNAME, PERSONID “ + “FROM FETISH
“+ “WHERE SURNAME IN ( ‘Jumpy’, ‘Engine’ ) ” );
que resultaria em:

CNAME PERSONID
Jill 854
Englebert 479

Schneider Electric- Treinamento- Junho/2009 179


Queries baseadas em conjuntos de
dados- Operadores IN e NOT IN
Ou de outra forma, você poderia procurar por todos os registros nos
quais determinados campos não se igualam a nenhum dos valores
encontrados em um conjunto de dados. Isto é implementado via o
operador NOT IN conforme mostrado abaixo:
SQLExec(hSQL, “SELECT CNAME, PERSONID “+“FROM FETISH “+
“WHERE SURNAME NOT IN ( ‘Jumpy’, ‘Engine’ ) ” );
que resultaria em:
CNAME PERSONID
Harold 654
Arnold 935
Catherine 367
David 746
Percival 153
James 946
Tracy 294

Schneider Electric- Treinamento- Junho/2009 180


Queries com condições Booleanas
Operadores AND e OR
Você pode fazer um query em uma base de dados procurando por
todos os registros que satisfaçam condições múltiplas. Estas condições
são separadas pelos operadores AND e OR respeitando a condição
lógica que você deseja. Isto poderia ser configurado da seguinte forma:
SQLExec(hSQL, “SELECT CNAME, PERSONID “+“FROM FETISH
“+“WHERE SURNAME = ‘Jumpy’ “+“OR SURNAME = ‘Engine’ ) ” );
que resultaria em:
CNAME PERSONID
Jill 854
Englebert 479

Schneider Electric- Treinamento- Junho/2009 181


Queries com condições Booleanas
Operadores AND e OR
SQLExec(hSQL, “SELECT * “+“FROM FETISH “+“WHERE SURNAME
IN ( ‘Jumpy’, ‘Engine’, ‘Point’ )“+“AND FETISH IN ( ‘Earlobes’, ‘Armpits’,
‘Pins’ ) ” );
que resultaria em:

CNAME SURNAME PERSONID STARTDATE PET FETISH


Percival Point 153 07-07-1994 Python Pins
Englebert Engine 479 10-06-1994 Elephant Earlobes

Schneider Electric- Treinamento- Junho/2009 182


Querying um range de valores -
Operador BETWEEN
É possível especificar um range em um query utilizando-se o operador
BETWEEN conforme mostrado abaixo:
SQLExec(hSQL, “SELECT * “+ “FROM FETISH “+ “WHERE
STARTDATE BETWEEN ‘1994-06-20’ AND ‘1994-07-30’ “ );
que resultaria em:

CNAME SURNAME PERSONID STARTDATE PET FETISH


Harold Heel 654 25-06-1994 Horse Hair
David Dandy 746 21-07-1994 Deer Dandruff
Percival Point 153 07-07-1994 Python Pins

Schneider Electric- Treinamento- Junho/2009 183


Querying search style - the LIKE
operator
É possível executar queries comparando parcialmente strings através
do operador LIKE. Você pode especificar se a comparação deve-se
igualar ao começo, ao fim ou a qualquer porção da string. Por exemplo
‘p%’ procuraria por strings iniciados com a letra ‘p’; ‘%p’ procuraria por
strings terminados com a letra ‘p’; ‘%p%’ procuraria por strings que
contém a letra ‘p’ em qualquer lugar dentro dela;
SQLExec(hSQL, “SELECT * “+ “FROM FETISH “+ “WHERE CNAME
LIKE ‘%n%’ “ );
que resultaria em:
CNAME SURNAME PERSONID STARTDATE PET FETISH
Arnold Amore 935 12-06-1994 Aardvark Armpits
Catherine Crispy 367 15-08-1994 Cat Cold
Englebert Engine 479 10-06-1994 Elephant Earlobes

Schneider Electric- Treinamento- Junho/2009 184


Querying Tabelas Múltiplas - Unindo
duas Tabelas
Com SQL é possível executar queries dentro de varias tabelas. Isto envolve
conectar as tabelas em uma query. Tabelas podem ser conectadas se elas
possuem uma coluna comum com valores que podem ser comparados. Deve-se
então listar todas as tabelas na porção FROM da declaração e então especificar
as colunas comuns (join condition) na porção WHERE da declaração. Os dois
seguintes exemplos como as tabelas FETISH e COUNTRY foram unidas para
queries.
SQLExec(hSQL, “SELECT * “+ “FROM FETISH, COUNTRY “+ “WHERE
FETISH.PERSONID = COUNTRY.PERSONID”)
que resultaria em:
CNAME PERSONID STARTDATE PET FETISH COUNTRY
SURNAME
Harold Heel 654 25-06-1994 Horse Hair Hungary
Jill Jumpy 854 14-05-1994 Jackal Jewels Jamaica
Arnold Amore 935 12-06-1994 Aardvark Armpits Australia
Catherine Crispy 367 15-08-1994 Cat Cold Cuba
David Dandy 746 21-07-1994 Deer Dandruff Denmark
Percival Point 153 07-07-1994 Python Pins Portugal
James Joint 946 08-05-1994 Jaguar Juice Jamaica
Englebert Engine 479 10-06-1994 Elephant Earlobes Ethiopia
Tracy Titan 294 11-04-1994 Tortoise Toe Thailand
Slime
Schneider Electric- Treinamento- Junho/2009 185
Querying Tabelas Múltiplas - Unindo
duas Tabelas
SQLExec(hSQL, “SELECT CNAME, FETISH “+ “FROM FETISH,
COUNTRY “+ “WHERE COUNTRY = ‘Jamaica’ “+ “AND
FETISH.PERSONID = COUNTRY.PERSONID” );
que resultaria em:
CNAME FETISH
Jill Jewels
James Juice

Schneider Electric- Treinamento- Junho/2009 186


A declaração INSERT
Para adicionar registros a uma tabela de base de dados, utilize a
declaração INSERT. A sintaxe desta declaração está mostrada abaixo:

INSERT INTO <table> [(<fields>)]


VALUES (<expr>, ...)

Schneider Electric- Treinamento- Junho/2009 187


A declaração INSERT - Exemplo
Os nomes dos campos são opcionais, e se utilizados, devem ser delimitados
por vírgulas. Se você omitir os nomes das colunas, então os valores deverão
estar na ordem das colunas onde deverão ser inseridos. Portanto por motivos de
segurança, não omita os nomes das colunas. Esta função é utilizada para
adicionar novos registros a base de dados. Um exemplo razoável seria o
mostrado abaixo:
SQLExec(hSQL, “INSERT INTO FETISH “ + “( CNAME, SURNAME,
PERSONID,STARTDATE, PET, FETISH ) “ +“VALUES( ‘Wallace’, ‘Wretch’, 783,
{10/27/1994}, ‘Wallaby’, ‘Whips’ ) ” );
que resultaria na seguinte aparência para a base de dados:
CNAME SURNAM PERSONI STARTDAT PET FETISH
E D E
Harold Heel 654 25-06-1994 Horse Hair
Jill Jumpy 854 21-06-1994 Jackal Jelly
Arnold Amore 935 12-06-1994 Aardvark Armpits
Catherine Crispy 367 15-08-1994 Cat Cold
David Dandy 746 21-07-1994 Deer Dandruff
Percival Point 153 07-07-1994 Python Pins
James Joint 946 08-05-1994 Jaguar Juice
Englebert Engine 479 10-06-1994 Elephant Earlobes
Tracy Titan 294 11-04-1994 Tortoise Toe Slime
Wallace Wretch 783 27-10-1994 Wallaby Whips

Schneider Electric- Treinamento- Junho/2009 188


A declaração UPDATE
Para modificar registros de uma tabela de base de dados, utilize a
declaração UPDATE. A sintaxe para esta declaração está mostrada
abaixo:
UPDATE <table>
SET <field> = <expression>,...
[WHERE <conditions>]

Schneider Electric- Treinamento- Junho/2009 189


A declaração UPDATE
A expressão pode ser um valor constante ou uma subquery. Esteja
atento quando utilizando a declaração UPDATE, desde que ela irá
modificar todo registro que obedecer o critério definido na porção
WHERE.
SQLExec(hSQL, “UPDATE FETISH “+ “SET FETISH = ‘Cold-cream’“ +
“WHERE PERSONID = 367” );
que resultaria na seguinte aparência para a base de dados:
CNAME SURNAME PERSONID STARTDAT PET FETISH
E
Harold Heel 654 25-06-1994 Horse Hair
Jill Jumpy 854 14-05-1994 Jackal Jewels
Arnold Amore 935 12-06-1994 Aardvark Armpits
Catherine Crispy 367 15-08-1994 Cat Cold-cream
David Dandy 746 21-07-1994 Deer Dandruff
Percival Point 153 07-07-1994 Python Pins
James Joint 946 08-05-1994 Jaguar Juice
Englebert Engine 479 10-06-1994 Elephant Earlobes
Tracy Titan 294 11-04-1994 Tortoise Toe Slime

Schneider Electric- Treinamento- Junho/2009 190


A declaração UPDATE
SQLExec(hSQL, “UPDATE FETISH “+ “SET STARTDATE =
{06/21/1994}, FETISH = ‘Jelly’ “+ “WHERE CNAME = ‘Jill’ ” );
que resultaria na seguinte aparência para a base de dados:

CNAME SURNAME PERSONID STARTDATE PET FETISH


Harold Heel 654 25-06-1994 Horse Hair
Jill Jumpy 854 21-06-1994 Jackal Jelly
Arnold Amore 935 12-06-1994 Aardvark Armpits
Catherine Crispy 367 15-08-1994 Cat Cold-cream
David Dandy 746 21-07-1994 Deer Dandruff
Percival Point 153 07-07-1994 Python Pins
James Joint 946 08-05-1994 Jaguar Juice
Englebert Engine 479 10-06-1994 Elephant Earlobes
Tracy Titan 294 11-04-1994 Tortoise Toe Slime

Schneider Electric- Treinamento- Junho/2009 191


A declaração DELETE
Para apagar registros em uma tabela de base de dados, utilize a declaração
DELETE. A sintaxe para esta declaração está mostrada abaixo:
DELETE FROM <table>
[WHERE <conditions>]
Este atento, pois se você não especificar a condição WHERE, então todos os
registros da tabela serão apagados.
SQLExec(hSQL, “DELETE FROM FETISH “+“WHERE CNAME = ‘James’” );
que resultaria na seguinte aparência para a base de dados:

CNAME SURNAME PERSONID STARTDATE PET FETISH


Harold Heel 654 25-06-1994 Horse Hair
Jill Jumpy 854 21-06-1994 Jackal Jelly
Arnold Amore 935 12-06-1994 Aardvark Armpits
Catherine Crispy 367 15-08-1994 Cat Cold-cream
David Dandy 746 21-07-1994 Deer Dandruff
Percival Point 153 07-07-1994 Python Pins
James Joint 946 08-05-1994 Jaguar Juice
Englebert Engine 479 10-06-1994 Elephant Earlobes
Tracy Titan 294 11-04-1994 Tortoise Toe Slime
Wallace Wretch 783 27-10-1994 Wallaby Whips

Schneider Electric- Treinamento- Junho/2009 192


Declarando Data e Hora no SQL

O modo pelo qual você declara data em SQL varia entre os systemas
de base de dados. Com DBase, você iria normalmente declarar data
entre chaves {02/18/95}, no Oracle você utilizaria o formato
to_date(‘02/18/95’, ’MM/DD/YY’).
Para tornar isto um pouco mais complicado, o driver ODBC você irá
utilizar um outro formato - ‘YYYY-MM-DD’.

Schneider Electric- Treinamento- Junho/2009 193


Sintaxe Data/Hora independente Base de
Dados
Se você deseja seus queries ser independentes da base de dados
sendo utilizada, você poderá utilizar a seguinte sintaxe para datas e
horas.
[d’YYYY-MM-DD HH:MM:SS.FFFFFF’]
A primeira letra depois do colchete deverá ser:

d Data,
t Hora, ou
dt Data e hora.

Independentemente se você está especificando uma data, hora ou


data/hora, você sempre deverá fornecer a string completa de 26
caracteres. Um exemplo de como especificar uma data está mostrado
abaixo:
[d’1995-02-18 00:00:00.000000’]

Schneider Electric- Treinamento- Junho/2009 194


Treinamento Cicode
● Introdução a programação com Cicode
● Introdução ao Cicode
Programa: ● Operadores de Variáveis
● O editor do Cicode
● Funções do Cicode
● Executores Condicionais
● Outras funções Cicode
● Cicode Debugger
● Apêndice A - Técnicas de Programação
Estruturada
● Apêndice B- Guia de Programação no
Cicode
● Apêndice C- SQL, Vijeo Citect e ODBC
● Apêndice D- Exemplos de Códigos de
Schneider Electric- Treinamento- Junho/2009
Programa 195
Apêndice D – Exemplos de
Códigos de Programa

Schneider Electric- Treinamento- Junho/2009 196


Objetivos do Apêndice

Ao final deste apêndice, você poderá:


Visualizar rotinas de programas do Cicode e, portanto se tornar mais
familiarizado com o mesmo.

Schneider Electric- Treinamento- Junho/2009 197


Exemplo C.1

Tag de Variable STRING1 recebe a data atual e o tag variável


STRING2 recebe a hora atual
FUNCTION
TimeDate()
STRING1 = Date(3);
STRING2 = Time(2);
END

Schneider Electric- Treinamento- Junho/2009 198


Exemplo C.2

Retorna a media entre os Tags de Variáveis INT1 e INT2


INT
FUNCTION
MyAverage()
Return ((INT1 + INT2) /2);
END

Schneider Electric- Treinamento- Junho/2009 199


Exemplo C.3

Atribui ao parâmetro [MESSAGE]Test do arquivo USER.INI uma


determinada String
FUNCTION
PutINI()
STRING sValue;

sValue=Input("Enter Value for parameter


" ,"NoSpaces","MyMessage");
WndPutFileProfile("Message","Test", sValue ,"USER.INI");

END

Schneider Electric- Treinamento- Junho/2009 200


Exemplo C.4

A função abaixo irá mostrar uma caixa de diálogo do tipo popup com o
status de um bit digital
FUNCTION
IfEg(INT Bit)
IF Bit THEN
Message(“IF Example”,”The Bit is on”,48);
ELSE
Message(“IF Example”,”The Bit is off”,48);
END
END

Schneider Electric- Treinamento- Junho/2009 201


Exemplo C.5

Esta função irá contra de 0 até um valor inteiro passado para ela e irá
mostrar esta contagem na linha de prompt.
FUNCTION
ForEg(INT IntX)
INT Count;
FOR Count = 1 To IntX DO
Prompt(IntToStr(Count));
Sleep(1);
END
Prompt(“”);
END

Schneider Electric- Treinamento- Junho/2009 202


Exemplo C.6

Esta função do Cicode irá incrementar o tag de variável analogical


INT3 enquanto a o tag digital BIT1 é TRUE e irá zerar a mesma variável
quando BIT1 se torna FALSE.
FUNCTION
WhileEg()
WHILE Bit1 DO
Int3 = Int3 + 1;
Sleep(1);
ReRead(1);
END
Int3 = 0;
END

Schneider Electric- Treinamento- Junho/2009 203


Exemplo C.7
STRING
FUNCTION

WhatDayIsIt()

STRING sDay;
INT iDay;

sDay = Input("Returns the day corresponding to a number 0 -6","Type a number(0 -


6)","0");
iDay = STRTOINT(sDay);
IF ((iDay<0) OR (iDay)>6) THEN
Message("Error","Invalid number entered. Try again",0);
RETURN "ERROR";
END

SELECT CASE iDay


CASE 0
RETURN "SUNDAY";
CASE 1
RETURN "MONDAY";
CASE 2
RETURN "TUESDAY";
CASE 3
RETURN "WEDNESDAY";
CASE 4
RETURN "THURSDAY";
CASE 5
RETURN "FRIDAY";
CASE 6
RETURN "SATURDAY";
CASE ELSE
Message("Error","Invalid number entered",0); END SELECT
END
Schneider Electric- Treinamento- Junho/2009 204
Dúvidas?

Schneider Electric- Treinamento- Junho/2009 205


Schneider Electric- Treinamento- Junho/2009 206

Você também pode gostar