Apostila CicodeV1
Apostila CicodeV1
Apostila CicodeV1
1
.
2
•
! ! "
! !
# $%
! & .
2
3
3
CONVENÇÕES UTILIZADAS
•2 '! !
! ! 4&
# + 5 " 5
• 6 ! " $ 7 8
,*.9":
" ! $ 7 8
,*$: $ ;
• 0 ! '
+ ! # '
!
<
$ 8
=
! ' !
>
= !
!
@ ? $ !&
>
= "
$ $
' >
' ?
+
$ $
4
Índice
C APÍ TULO 1 ............................................................................................... 9
INTRODUÇ ÃO A PROGRAM AÇ ÃO COM CICODE ........................................... 9
Objetivos do Capítulo ............................................................................................... 11
Os Objetivos do Curso.............................................................................................. 11
Programa do Curso .................................................................................................. 11
C APÍ TULO 2 .............................................................................................. 14
INTRODUÇ ÃO AO CICODE ......................................................................... 14
Objetivos do Capítulo ............................................................................................... 16
Comandos ............................................................................................................... 16
Configuração de Variáveis ........................................................................................ 19
Expressões .............................................................................................................. 20
Executando Cálculos ................................................................................................ 20
Visualização de Dados ............................................................................................. 21
Declarações Múltiplas............................................................................................... 21
Obtendo Entrada de Dados do Operador ................................................................... 22
Chamando Funções em Comandos e Expressões ...................................................... 26
Passando Dados para as Funções ............................................................................ 28
Argumentos do tipo STRING ..................................................................................... 28
Passando Múltiplos Argumentos ............................................................................... 30
Passando Argumentos Numéricos ............................................................................. 30
Passando Variáveis como Argumentos ...................................................................... 30
Retornando dados das Funções ................................................................................ 34
Executando funções quando partindo o sistema......................................................... 37
C APÍ TULO 3 .............................................................................................. 39
OPER ADORES DE VARI ÁVEI S .................................................................... 39
Objetivos do Capítulo ............................................................................................... 41
Classes de Operadores ............................................................................................ 41
Operadores Matemáticos .......................................................................................... 41
Operadores Lógicos ................................................................................................. 42
Operadores de Bit .................................................................................................... 45
Operadores Relacionais ........................................................................................... 45
Operador de Formato ............................................................................................... 46
Ordem de Precedência dos Operadores .................................................................... 47
C APÍ TULO 4 .............................................................................................. 49
O EDI TOR DO CICO DE ............................................................................... 49
Objetivos do Capítulo ............................................................................................... 51
Como iniciar o Editor do Cicode ................................................................................ 51
Criando um novo Arquivo do Cicode.......................................................................... 52
5
Uso do Goto para acessar erros ............................................................................... 52
Compilando e executando ........................................................................................ 53
Navegação por Arquivos .......................................................................................... 54
Ferramentas de Edição ............................................................................................ 59
Ferramentas de Funções.......................................................................................... 62
Preferências ............................................................................................................ 65
9. Selecione o elemento Strings, marque as opções Bold e Italic. Clique no
botão OK. Comprove sua alt ..................................................................................... 67
C APÍ TULO 5 .............................................................................................. 69
FUNÇÕES DO CICO DE ............................................................................... 69
Objetivos do Capítulo ............................................................................................... 71
Escrevendo Funções Simples ................................................................................... 71
Sintaxe das Funções ................................................................................................ 72
Elementos das Funções ........................................................................................... 72
Funções Public e Private (Scope) ............................................................................. 73
Declarando Funções ................................................................................................ 73
Nomeando Funções ................................................................................................. 73
Declarações ............................................................................................................ 74
Funções do tipo Void ............................................................................................... 74
Variáveis do Cicode ................................................................................................. 77
Variáveis Globais ..................................................................................................... 79
Variáveis Modulares - Module................................................................................... 80
Variáveis Locais ...................................................................................................... 81
Padrões Quando Atribuindo Nomes para Variáveis .................................................... 81
Tags de Variáveis .................................................................................................... 81
Conversão e Designação de formato para as variáveis do Cicode .............................. 83
C APÍ TULO 6 .............................................................................................. 89
EXECUTORES CO NDICION AI S ................................................................... 89
Objetivos do Capítulo ............................................................................................... 91
Declaração IF .......................................................................................................... 91
FOR Loop................................................................................................................ 93
Loop WHILE ............................................................................................................ 94
A Declaração SELECT CASE ................................................................................... 95
C APÍ TULO 7 .............................................................................................. 99
OUTR AS FUNÇÕES CICODE ....................................................................... 99
Objetivo do Capítulo ...............................................................................................101
Funções do Tipo Return ..........................................................................................101
Arrays 104
Sintaxe 105
Inicializando um Array .............................................................................................105
6
Dimensões de Arrays ............................................................................................. 106
Utilizando Arrays .................................................................................................... 106
Comentários .......................................................................................................... 108
C APÍ TULO 8 ............................................................................................ 111
CICODE DEBUGGER ................................................................................ 111
Objetivo do Capítulo ............................................................................................... 113
O Ambiente do Editor do Cicode ............................................................................. 113
Passo Seguinte – Avançando pelo código ............................................................... 117
APÊNDICE A ........................................................................................... 123
TÉCNIC AS DE PRO GR AM AÇ ÃO ESTRUTUR AD A ....................................... 123
Objetivos do Apêndice ............................................................................................ 125
Diagramas Lógicos de Fluxo ................................................................................... 125
Conclusão.............................................................................................................. 128
APÊNDICE B ........................................................................................... 129
GUI A DE PROGR AM AÇ ÃO NO CICODE ..................................................... 129
Objetivos do Apêndice ............................................................................................ 131
Introdução ............................................................................................................. 131
Definições e Convenções de Nomes ....................................................................... 131
Variáveis ............................................................................................................................................................131
Nome de Variáveis.........................................................................................................................................131
Funções................................................................................................................. 133
Formato de Arquivos de Biblioteca e Funções.......................................................... 134
Funções: ............................................................................................................................................................134
8
! " # $ #%# " & %
&
9
! " # $ #%# " & % &
10
! " # $ #%# " & % &
'( #) *
6 ' & $ 8
- Visão Geral do Curso;
- Programa 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.
$ #%#
Este curso de treinamento tem uma duração de dois dias. O programa delineado
abaixo apresenta o que será coberto em cada dia
Primeiro dia
- Introdução ao Cicode
- Operadores de Variáveis utilizados no Cicode
- Editor do Cicode
- Escrita de Funções Simples
- Uso de variáveis do Cicode
- Funções de Conversão
- Arquivos de Inclusão
11
! " # $ #%# " & % &
Segundo dia
- Executores Condicionais
- Tipos de Função
- Matrizes
- Depuração de Código
12
! " # $ #%# " & % &
13
+
! " # &
14
! " # &
15
! " # &
Neste capítulo nós iremos aprender a realizar uma série de tarefas. Elas se encontram
dentro de três categorias: comandos, expressões e funções.
'( #) *
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
%#!
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.
Cada comando tem seu próprio mecanismo de ativação. Os comandos podem ser emitidos
manualmente através de uma seqüência digitada pelo operador ou clicando-se em um botão
ou objeto em uma página gráfica. Podemos inclusive configurar comandos para serem
executados automaticamente:
• Quando uma página gráfica é acessada, quando está sendo mostrada ou quando é
fechada;
• Em um relatório
16
! " # &
Cada declaração em um comando, usualmente executa uma única tarefa tal como
atribuir um valor a uma determinada variável, calcular um valor, mostrar uma
mensagem na tela ou emitir um relatório.
, &)
& +-
Na página “Treinamento” crie dois botões para ligar/desligar o Agitador do Silo.
1. Abra a página “Treinamento”.
2. Apague o objeto de texto que diz “Crie os botões embaixo do capítulo
correspondente........”
3. Crie um botão abaixo do título Capítulo 2 conforme mostrado nas figuras abaixo.
17
! " # &
18
! " # &
!.$ # " # /
Os comandos executam tarefas específicas tais como atribuir valores à variáveis ou
mudar o status de um bit. Como vimos no exercício anterior, nós podemos alterar o
status do Agitador do Silo de Leite. Se definirmos um tag digital chamado
BOMBA_CMD para controlar a bomba, nós podemos ligar esta bomba fazendo este
tag igual a 1. Isto é implementado inserindo o seguinte comando:
Execute
BOMBA_CMD = 1;
Command
Execute BOMBA_CMD = 0;
Command
Da mesma forma, podemos atribuir valores para variáveis analógicas.
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
Podemos também atribuir a esta variável o valor de uma outra variável analógica da seguinte
forma:
, &)
& +-+
Crie botões na sua página “Treinamento” para atribuir valores aos tags TIC_COOL_PV e
TIC_P2_PV.
1. Abaixo do titulo Capítulo 2, crie um botão para atribuir o valor -3 para
TIC_COOL_PV.
2. Crie um novo botão para atribuir a TIC_P2_PV o valor de TIC_COOL_PV.
3. Salve sua página, compile seu projeto e teste os novos comandos.
19
! " # &
Você também pode fazer uso de variáveis do tipo STRING em expressões. Por
exemplo, se NOME_BATELADA é um tag de variável do tipo string, você pode usar o
seguinte comando para atribuir ao tag o valor “RACAO ESPECIAL”:
Execute
NOME_BATELADA = "RACAO ESPECIAL";
Command
Quando fazendo uso de string literal, você deve colocá-la entre aspas.
, &)
& +-0
Utilize um comando do tipo Touch para trocar o valor de um Tag do tipo STRING para um
string literal.
1. Crie um botão na página “Treinamento” para atribuir a string
“Full Cream Milk?” à variável Recipe.
2. Salve sua página
3. Compile, execute e teste seu projeto.
, 1
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.
Diferentemente de um comando, uma expressão não executa uma tarefa específica. Em vez
disso, ela é simplesmente alguma coisa que pode ser avaliada. O processo de avaliação
retorna um valor que você pode utilizar para mostrar informações na tela (por ex. uma barra
gráfica) ou para tomar decisões.
A seguinte expressão simples retorna o resultado 12:
Numeric
8+4
Expression
No exemplo acima, o valor da expressão é sempre uma constante (12) dado que os
elementos da expressão também são constantes.
, & #! /*
&*
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
20
! " # &
Quando o comando for executado, à variável MILL1_SPEED, será atribuído o valor da soma
das variáveis MILL2_SPEED e MILL3_SPEED menos o valor 100. Observe a sintaxe que se
utiliza nestes cálculos. A variável que contêm o resultado da expressão se coloca a esquerda
da sequência de comandos.
Resultado = Operando1 + Operando2 + Operando3;
#*2# " 3#
No exemplo seguinte, o valor da expressão é o valor da variável TIC_HOLD_PV.
Quando seu valor muda, o valor da expressão também muda. Você pode utilizar esta
expressão para mostrar um número em uma página gráfica.
Numeric TIC_HOLD_PV
Expression
As expressões podem também incluir cálculos matemáticos. Por exemplo, você pode
adicionar duas variáveis e mostrar o valor total combinado conforme mostrado abaixo:
Numeric
TIC_HOLD_PV + TIC_P4_PV
Expression
Neste caso, o valor da expressão é o valor combinado total. Se uma das variáveis (ou
ambas) muda(m), o valor da expressão também muda.
, &)
& +-4
Crie um botão para adicionar o valor de 02 tags analógicos
1. Na página “Treinamento” crie um botão chamado “TIC_P4_PV” que deverá adicionar os
tags TIC_P1_PV e TIC_P2_PV e retornar o valor no tag TIC_P4_PV.
2. Salve sua página
3. Compile, execute o projeto e teste o novo comando.
3 &*
## 1 5* *
#
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 ESPECIAL”;
Command
LIC_SILO_SP = 450;
21
! " # &
O numero de declarações que você pode inserir em uma propriedade de comando está
limitado apenas ao tamanho do campo. Entretanto, para uma melhor visualização e clareza,
é melhor não utilizar muitas declarações – insira as declarações em um arquivo “Include” ou
escreva uma função do Cicode. Você pode então fazer referência ao Include File ou chamar
a função do Cicode por um comando. (Include Files e funções serão discutidas
posteriormente)
Para mais informações sobre Include Files, procure no Vijeo Citect Help Topics por Using
Include (Text) Files
, &)
& +-6
Crie uma declaração múltipla
1. Na página “Treinamento” modifique o botão configurado anteriormente para calcular a
soma de TIC_P1_PV e TIC_P2_PV. Adicione uma segunda declaração para fazer com
que à mensagem “Cálculo Terminado” apareça na linha de Prompt.
2. Salve sua página.
3. Compile, execute seu projeto e comprove o resultado.
' ! ! ## 3# #
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:
Execute
LIC_BALANCE_SP = 10
Command
Uma seqüência de teclas pode fornecer meios para, por exemplo, permitir ao operador inserir
dados, estabelecer novos setpoints, etc. No seguinte exemplo, o operador pode atribuir um
valor para a variável LIC_BALANCE_SP. A figura abaixo ilustra:
22
! " # &
A entrada do operador…..
23
! " # &
, &)
& +-:
Crie um comando de teclado de objeto para alterar a string mostrada em STRING3.
1. Na página “Treinamento” modifique o texto ao lado de STRING3. Selecione o tab
horizontal Input e o tab vertical Keyboard Commands.
24
! " # &
System|Keyboard Keys.
7. Crie uma tecla denominada F2 que utilize o código de tecla KEY_F2.
12. Verifique agora que você pode inserir qualquer numero de caracteres (limitado a 10)
que ao pressionar ENTER os caracteres serão mostrados no campo dinâmico.
, &)
& +-;
Defina uma seqüência de teclas para trocar o valor de INT3 quando o mouse for
posicionado em cima do número.
1. Crie uma nova tecla de teclado para ser utilizada em uma nova seqüência de teclas.
Abra o Editor de Projetos do Vijeo Citect e selecione o menu System|Keyboard
Keys.
2. Crie uma tecla denominada F3 que utilize o código de tecla KEY_F3.
25
! " # &
3. Na página Treinamento aplique um duplo clique em cima do objeto dinâmico INT3 para
abrir o quadro de diálogo de propriedades.
4. Selecione o tab horizontal Input e o tab vertical Keyboard Commands e adicione a nova
sequência de teclas. Clique em OK para continuar.
5. Salve sua página, compile o projeto e teste o novo comando.
Execute
FunctionName(Arg1, Arg2, ...);
Command
26
! " # &
Onde: FunctionName é o nome da Função e Arg1, Arg2, ... são os argumentos que você
passa para a função
Um exemplo desta chamada poderia ser o comando de teclado abaixo:
Key Sequence End_Key
Execute Command Shutdown();
Quando a tecla END é pressionada, a função Shutdown() é chamada e o Vijeo Citect deixa
de ser executado (retirado do modo de run time).
Configure o comando de teclado de sistema acima. Salve sua página, compile e execute seu
projeto e comprove o resultado de sua alteração.
Configure primeiramente a tecla END_KEY em Keyboard Keys e somente depois configure
o comando de sistema em Keyboard Commands. As figuras abaixo ilustram.
, &)
& +->
27
! " # &
# #! 3# # ## = ! 1
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.
$ % ! 8
As funções podem requerer diversos argumentos ou, como no seguinte exemplo, um
único argumento.
Execute
PageDisplay("Caldeira1");
Command
Esta função quando executada, mostra a página gráfica “Caldeira1”. Observe que
quando você passa uma STRING para uma função, você deve sempre inseri-la entre
aspas duplas (“”).
Execute
Prompt("Pressione F1 para Ajuda");
Command
28
! " # &
, &)
& +-?
Crie um comando de teclado de sistema que mostre a página de Treinamento quando o
operador clicar com o botão direito do mouse.
1. Abra o Editor de Projetos do Vijeo Citect e selecione o menu System|keyboard
Commands. Clique no botão Add.
2. No campo Key Sequence selecione RBUTTON_UP.
3. No campo Command digite o comando PageDisplay(“Treinamento”).
4. Digite um comentário qualquer informativo.
5. Compile, execute e teste seu projeto quando estiver mostrando a página de Menu.
, &)
& +- @
Crie um botão na sua página “Treinamento” chamado “Excel” que utiliza a função
Exec() para iniciar o Excel.
1. Abra o Editor Gráfico e em seguida a página Treinamento e crie um novo botão embaixo
de Capítulo 1.
2. Selecione o TAB horizontal Appearance e digite EXCEL no campo Texto. Selecione
agora o TAB horizontal Input e o TAB vertical Touch. Digite o path completo onde pode
ser encontrado o EXCEL.EXE (veja dica abaixo).
3. Salve sua página, compile o projeto e execute-o novamente para comprovar o novo
comando.
4. Feche o projeto.
29
! " # &
# #! 5* * $ % !
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
A ordem dos argumentos é importante para a operação de qualquer função. A função
Login() quando executada, valida um determinado usuário no sistema de tempo real. O
primeiro argumento ("Manager") indica o nome do usuário e o segundo argumento ("ABC")
a senha (“Password”) do mesmo. Se você inverte a ordem dos argumentos, a função irá
tentar validar o usuário “ABC” e não existindo este, uma mensagem de erro será mostrada.
# #! $ % ! %A &
Você pode passar números (inteiros e de ponto flutuante) diretamente para uma função,
como por exemplo:
# #! # / &% $ % !
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. O seguinte exemplo utiliza a função
DspStr() para mostrar o valor de uma variável de processo no Ponto de Animação
(Animation Point) 25:
Execute
DspStr(25, "TextFont", NIVEL);
Command
Neste caso, o valor do nível é mostrado. Se ela é uma variável de tempo real, o número
mostrado depende do valor dela naquele momento.
Se você inclui o tag entre aspas na função acima, como por exemplo, “NIVEL” então
a string NIVEL e não seu valor é que será mostrado.
30
! " # &
, &)
& +-
Crie uma página emergente de tendências e especifique os tags de tendência que serão
mostrados.
1. Crie uma página baseado no template CES_Style Pop Trend.
2. Selecione no menu File|New.
3. Selecione Page na figura abaixo.
31
! " # &
, &)
& +- +
Podemos passar números (inteiros e de ponto flutuante) diretamente a uma função, como por
exemplo:
Comando AlarmAck(2,35)
1. Adicione um comando de botão na página Treinamento para abrir uma página emergente
em uma localização determinada.
2. Selecione o tab horizontal Appearance e o tab vertical General. No campo Text
digite PUMP FEED.
3. Mantenha o tab vertical General selecionado e selecione agora o tab horizontal
Input.
4. Adicione a função AssWin() conforme mostrado na figura abaixo:
AssWin("!Pump",485,310,1+8+512,"PUMP_FEED_CMD", “PUMP_FEED_M");
32
! " # &
7. Adicione outro comando para mostrar o nome do Tag na barra de título da página
emergente.
8. Abra o Editor Gráfico do Vijeo Citect e selecione a página Treinamento. Abra as
propriedades do botão PUMP FEED e adicione o seguinte comando a entrada Input.
Observe que será necessário acrescentar um (;) - ponto e vírgula - depois do comando
superior de forma a separar os comandos.
WinTitle(“PUMP_FEED”);
33
! " # &
, &)
& +- 0
Utilize uma função com argumentos de variável para mostrar o valor de um tag em um objeto
de Cicode.
1. Abra a página Pasteuriser e coloque um objeto Cicode sobre o objeto.
!#! # # =!1
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.
34
! " # &
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. Para mostrar a data corrente em uma
página gráfica, utilize a seguinte expressão em um objeto do tipo texto.
Numeric
Date();
expression
O seguinte exemplo mostra um evento de comando de entrada para uma página gráfica que
combina duas funções. A função FullName() informa o nome do usuário que está
correntemente logado no sistema, passando então este nome para a função de chamada
Prompt() que concatena então as duas strings. Quando a página é aberta, uma mensagem
de boas vindas é mostrada na linha de prompt.
Por exemplo, se o usuário corrente se chama Paulo Silva, então teremos a mensagem "Ola,
Paulo Silva” mostrada na linha de prompt.
, &)
& +- 4
Na página “Pasteuriser” utilize a função FormNumPad() para adicionar um comando para
alterar os valores dos tags LIC_BALANCE_PV, SIC_CENT_PV e PIC_HOMOG_PV, de tal
forma que um teclado deverá aparecer quando clicarmos com o botão esquerdo do mouse
em cima dos valores das variáveis.
1. Os valores dos tags acima são controlados mediante um Genie utilizado na página
Pasteuriser chamado ChangeValue.
2. Este Genie se encontra na biblioteca Training. Abra o Genie ChangeValue.
3. A figura abaixo ilustra o Genie ChangeValue.
4. Aplique um duplo clique em cima do objeto para abrir suas propriedades. Selecione o tab
horizontal Input e o tab horizontal Touch. Adicione o comando mostrado na figura abaixo.
No run time, quando se clicar com o botão direito do mouse em cima do objeto, um
teclado emergente será mostrado e será possível alterar os valores dos tags.
35
! " # &
7. Compile e execute seu projeto. Abra a página Pasteuriser e clique com o botão esquerdo
do mouse nos objetos que mostram os valores dos tags LIC_BALANCE_PV,
SIC_CENT_PV e PIC_HOMOG_PV. As figuras abaixo ilustram:
36
! " # &
, & #! .! 1 B #! # !
%#
O Vijeo Citect possui um parâmetro especial que pode executar uma determinada função
quando o sistema é iniciado.
Para fazer o setup do Parâmetro de Startup:
37
! " # &
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.
38
0
# # /
39
# # /
40
# # /
'( #) *
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.
*
# #
O texto abaixo descreve as cinco classes de operadores disponíveis no Vijeo Citect.
# # %/ &
Os operadores matemáticos padrões são utilizados para executar cálculos em variáveis
numéricas tais como números inteiros e de ponto flutuante. Os operadores matemáticos
disponíveis são:
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)
Assim, se TAG_2 é igual a 101, então TAG_1 resulta em 1 ( que é igual ao resto da divisão
de TAG_2 por 100)
Um exemplo do operador de concatenação é mostrado abaixo:
41
# # /
Apenas variáveis do tipo string podem ser passadas para a função Prompt() e uma forma
de se mostrar o valor de TAG_1 é através do uso da concatenação como mostrado acima.
Observe que desde que TAG_1 é do tipo inteiro, necessitamos converte-lo para string
antes de utilizá-lo na função, daí a utilização da função IntToStr().
, &)
& 0-
Na sua página “Treinamento” debaixo do texto Capitulo 3, crie um botão que realize um
cálculo mediante o uso do operador MOD.
1. No campo texto digite MODULO para o botão acima.
, &)
& 0-+
Na sua página “Treinamento” debaixo do texto Capitulo 3, crie um botão que realize uma
concatenação.
1. No campo texto digite CONCATENAÇÃO para o botão acima.
# C$ &
42
# # /
Operadores Lógicos podem ser utilizados para testar o estado lógico de um operador. O
resultado retornado após o teste pode ser apenas TRUE (1) ou FALSE (0). Os três
operadores lógicos são:
Operador Descrição
AND Logica AND
OR Logica OR
NOT Logica NOT
, &)
& 0-0
Na sua página “Pasteuriser” comprove a condição de Lógica AND.
1. Aplique um duplo clique em cima da tubulação que interliga a Feed Pump e Centrifuge
Clarifier. O seguinte quadro de diálogo será mostradro:
, &)
& 0-4
Na sua página “Pasteuriser” crie um objeto de texto que troque seu valor em função da
condição de um tag de alarme. A condição A será mostrada se a propriedade de alarme tiver
no estado de alarme ALTO (HI) ou MUITO ALTO (HI HI). A condição B será mostrada se
43
# # /
propriedade de alarme tiver no estado de alarme BAIXO (LOW) ou MUITO BAIXO (LOW
LOW).
, &)
& 0-6
Crie um alarme digital que se ativa quando um determinado tag digital se desativa.
1. Abra o Editor de Projetos do Citect e selecione Alarms|Digital Alarms.
alarme.
#
Os seguintes padrões de operadores de bit são fornecidos com o Cicode:
Operador Descrição
BITAND Bitwise AND
BITOR Bitwise OR
BITXOR Exclusive OR
# *
#& !#
Para testar a relação entre dois valores podemos utilizar os operadores relacionais.
Operador Descrição
= IGUAL
<> DIFERENTE DE
< MENOR QUE
> MAIOR QUE
<= MENOR OU IGUAL QUE
>= MAIOR OU IGUAL QUE
, &)
& 0-:
Crie um alarme avançado que se ativa quando um determinado tag alcança um valor maior
ou igual a 3.
1. Abra o Editor de Projetos do Citect e selecione Alarms|Advanced Alarms.
alarme.
# = %#
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: ####.#
Neste exemplo, TAG_1 seria mostrado com quatro casas decimais e uma casa depois da
vírgula. Este tipo de formatação pode ser utilizado quando mostrando um número como uma
string. Nós fazemos uso freqüente disto quando formatando relatórios no Vijeo Citect.
, &)
& 0-;
Utilize o operador de formato em um quadro de mensagem para mostrar o valor de um
determinado tag.
1. No Editor Gráfico, abra a página Pasteuriser.
46
# # /
% & D!&# #
No Cicode, cada operador tem uma determinada precedência. Isto significa que um operador
de mais alta precedência será executado antes de operadores de mais baixa precedência. A
precedência dos operadores, da mais alta para a mais baixa esta mostrada abaixo:
1. ()
2. NOT
3. *, /, MOD
4. :
5. +, -
6. <, >, < =, > =
7. =, < >
8. AND
47
# # /
9. OR
10. BITAND, BITOR, BITXOR
NOT TAG_3 é calculado primeiro, ao resultado será aplicada lógica END com TAG_2.
Finalmente ao resultado será aplicada lógica OR com TAG_1. Isto é equivalente a:
A utilização dos parênteses mostra de uma forma mais clara como a ordem de
precedência será aplicada.
, &)
& 0->
Na sua página “Treinamento”, crie um botão chamado “Declaração” de forma a executar a
seguinte expressão lógica.
BIT3 = BIT1 AND NOT BIT2
48
4
&
49
&
50
&
'( #) *
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.
% ! &# &
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.
Para obter ajuda em qualquer dos ícones, selecione Help | Cicode Editor Help no Editor do
Cicode. Uma vez no Help, clique em menus, botões e outros elementos de tela para uma
melhor explicação. (Você pode inclusive fazer uso dos chamados Tool tips – dicas de
ferramentas)
51
&
#! %! B &
, &)
& 4-
No Editor do Cicode, crie um novo arquivo do Cicode chamado Treinamento. Ele será usado
no próximo capítulo para todas as nossas rotinas e funções do Cicode. Para criar um novo
arquivo do Cicode:
i. No Editor do Cicode, clique no botão .
-ou-
No menu, selecione File | New.
8 # ##& #
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.
No campo de contexto, o número da linha onde o erro ocorreu será mostrado bem como um
par de chaves envolvendo a provável causa do erro.
52
&
% *
#! , & #!
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 .
, &)
& 4-+
Crie uma função para comprovar o compilador.
1. No Editor do Cicode, selecione File | Open ou clique no ícone para abrir o arquivo
Treinamento.ci que você criou anteriormente.
2. Escreva a seguinte função simples:
FUNCTION
ChangeValue()
TagValue=10;
END
3. Salve seu arquivo.
4. Compile o projeto. O depurador lhe indicará que existem 04 erros conforme figuras
abaixo:
53
&
7. Pressione o botão GoTo na figura acima para acessar o erro detectado. A seguinte
figura mostra o Editor do Cicode aberto com o local do erro apontado.
# $# " B
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. A figura abaixo ilustra:
54
&
Foi adicionado um sistema de fichas (TABS) para proporcionar três vistas distintas dos
arquivos. São elas:
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.
55
&
Esta característica é muito útil quando é necessário abrir arquivos que tem o mesmo nome,
mas que pertencem a projetos diferentes. Na lista da janela do Editor do Cicode se mostrará
o nome do arquivo. Não podemos utilizar esta vista para diferenciar entre arquivos que tem o
mesmo nome, mas que pertencem a projetos diferentes.
Já na janela Open Files são mostrados os arquivos e suas rotas completas. Se você
deseja trocar de arquivo, basta aplicar um duplo clique no nome do arquivo desejado e
pronto, ele será aberto pelo Editor do Cicode para Edição.
Open Project
56
&
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.
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.
57
&
58
&
= #% ! # "
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.
Pode-se mostrar e ocultar janelas e barras de ferramentas com apenas um clique do botão
direito do mouse na parte superior da área de menus. Isto ativará um menu emergente em
que aparecerão as barras de ferramentas e as janelas disponíveis. As janelas e as barras de
ferramentas atualmente mostradas estão selecionadas na lista.
Controlador de translado
Formatação e Comentários
59
&
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.
60
&
# &#
#E !
Insira um marcador clicando com o botão direito do mouse na barra indicadora. Para remover
o marcador, clique novamente com o botão direito sobre ele. Ao clicar com o botão esquerdo
do mouse na barra indicadora será inserido/removido um breakpoint. Uma nova barra de
ferramentas foi adicionada para controlar a inserção/remoção de marcadores bem como a
navegação entre eles. A figura abaixo ilustra:
, &)
& 4-0
Utilize algumas das novas funções de edição para criar uma função do tipo ActiveX.
1. Selecione a ficha (TAB) All Projects para acessar e abrir o arquivo Sample.ci no projeto
Example.
2. Marque e copie a função CreateCiMeter() e coloque um marcador na barra
indicadora.
3. Cole o texto copiado sobre o texto original CreateCiMeter().
4. Marque o texto colado e utilize CTRL+H para abrir o formulário Substituir. Substitua
o texto CiMeter por WebBrowser no texto selecionado.
61
&
6. Selecione várias linhas de texto na nova função e clique no ícone Comment . Se não
estiver visualizando o ícone, clique com o botão direito do mouse na barra de ferramentas
e selecione Format nas opções do menu. Em seguida elimine os comentários das linhas
.
8. Coloque um marcador ao lado da nova função clicando com o botão direito
do mouse na barra indicadora ao lado do novo código. Pressione F2 no teclado. O
cursor irá parar em todos os marcadores.
= #% ! # =!1
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).
Clique com o botão direito do mouse no arquivo e selecione List Functions no menu ou
CTRL+SPACE no teclado. Este procedimento mostrará uma lista das funções do Cicode ou
uma lista das funções do CitectVBA, no caso a mais adequada para o arquivo atual.
62
&
, &)
& 4-4
Escreva uma nova função do Cicode para calcular a área de um círculo.
1. Abra o arquivo Treinamento.ci que você criou anteriormente.
REAL
FUNCTION
AreaofCircle(REAL rRaio)
REAL Area;
63
&
END
5. Abra o arquivo Treinamento.ci aplicando um duplo clique em seu nome na lista Open
Project. Agora a função aparecerá em azul.
6. Crie uma função para comprovar sua nova função de usuário AreaOfCircle().
64
&
9. Todas as funções incorporadas e qualquer função que foram criadas pelo usuário e
compiladas aparecerão na lista. Ao clicar em uma das funções, será mostrada a função
completa na barra de ferramentas de ajuda. Aplique um duplo clique na função
AreaOfCircle() para inserir a função no ponto de inserção.
10. Utilize a instrução END para terminar a função.
FUNCTION
Teste()
AreaofCircle(20)
END
11. Salve seu arquivo e compile seu projeto.
. D!&#
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:
, &)
& 4-4
Troque as preferências default do Editor do Cicode utilizando um arquivo de Cicode
existente.
1. Abra o arquivo Sample.ci no projeto Example.
65
&
66
&
9. Selecione o elemento Strings, marque as opções Bold e Italic. Clique no botão OK.
Comprove sua alt
67
&
68
6
=!1 &
69
=!1 &
70
=!1 &
O Vijeo Citect é fornecido com mais de 600 funções prontas em sua biblioteca. Uma função
ou combinação destas, pode usualmente executar a maioria das tarefas em seu sistema.
Entretanto, quando uma determinada funcionalidade não poder ser alcançada com as
funções disponíveis na biblioteca, você poderá escrever suas próprias funções.
Uma função do Cicode consiste de um pequeno programa que pode conter uma coleção de
declarações, variáveis, operadores, executores condicionais e funções.
'( #) *
Neste capítulo você irá aprender:
& ! =!1 % *
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.
Por exemplo, o seguinte comando incrementa a variável tag COUNTER:
Este comando seria utilizado de maneira mais fácil (podendo ser reutilizado) se tivesse sido
escrito como uma função que pudesse ser chamado via um comando do tipo:
Execute
IncContador();
command
71
=!1 &
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
! #, # =!1
Para aprender como escrever suas próprias funções, nós precisamos utilizar a sintaxe
correta. Nós iniciaremos tomando como exemplo um simples comando em um pseudocódigo.
Imagine que você está indo dizer “levante-se” para alguém.
Escrita em pseudocódigo, iria se parecer com o seguinte:
OLA
Levante()
SE dito ENTÃO
Levante;
SENÃO
Permaneça sentado;
TERMINADO
TCHAU
*% ! # =!1
As funções podem conter quatro elementos básicos, a saber:
• Scope - Escopo
• Declaration - Declaração
72
=!1 &
3 &*
# #! =!1
No Cicode, as funções devem ser declaradas. Em outras palavras, você necessita fazer com
que o Cicode saiba o começo e o final do código da função. Você declara as funções
utilizando a palavra FUNCTION conforme mostrado abaixo;
Scope
FUNCTION
Par NomeFuncao()
companheiro
Statements;
END
Você deve finalizar sua função com a palavra END.
% #! =!1
Depois que uma função é declarada, você deve fornecer a ela um nome. 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.
73
=!1 &
Quando escrevendo suas funções, constitui-se uma boa prática a mistura de letras
maiúsculas e minúsculas para melhor visualização, MyPageDisplay() é mais fácil de
ler do que mypagedisplay() ou MYPAGEDISPLAY().
Uma declaração de uma função deve conter parênteses () para acomodar os argumentos
(falaremos deles mais adiante), não importando se a função faz ou não uso deles, por
exemplo:
SCOPE
FUNCTION
NomeFuncao()
Statements;
END
3 &*
## 1
As declarações constituem o essencial sobre o que estamos fazendo. A declaração
representa o código que será executado quando a função é chamada. Por exemplo, se você
necessita escrever uma função para mostrar um aviso quando a bomba de pasta estiver
ligada, então a função poderia ser como a mostrada abaixo:
PUBLIC
FUNCTION
DeclaracaoExemplo ()
IF STATUS_BMB_PASTA THEN
PROMPT(“Bomba Pasta Ligada”);
Par ELSE As declarações
Companheiro
PROMPT(“Bomba Pasta Desligada”);
END
END
=!1
Todas as funções retornam alguma coisa após a execução, mesmo se for uma confirmação
de que a função foi executada com sucesso ou não. Entretanto, as funções do tipo Void,
quando chamadas, não retornam qualquer dado para a função de chamada ou para a linha
de comando. O comando ShutDown() utilizado no curso de configuração não retornou
nenhuma informação ou dado, ele apenas executou uma ação. As funções do tipo Void são
tipicamente utilizadas para executar um conjunto de tarefas em botões ou comandos de
teclado. As funções que estivemos tratando até o presente momento, com algumas exceções
são do tipo Void.
PUBLIC
FUNCTION
ExemploVoid()
74
=!1 &
IF STATUS_BMB_PASTA THEN
Prompt(“Bomba Pasta Ligada”);
ELSE
Prompt(“Bomba Pasta Desligada”)’
END
END
Observe que nada é retornado desta função, mas uma ação é executada quando é
mostrado se a bomba está ou não ligada na linha de Prompt.
Para chamar esta função nós poderíamos executar um comando tal como o mostrado abaixo:
Execute
ExemploVoid();
command
, &)
& 6-
75
=!1 &
PUBLIC
FUNCTION
DataHora()
STRING1 = Date(3);
STRING2 = Time(1);
END
7. Crie um botão na página Treinamento abaixo do texto “Capítulo 5” para fazer a
chamada da função.
, &)
& 6-+
Crie uma função que podemos usar para gerar um alarme sonoro com uma mensagem do
tipo emergente na tela.
1. No editor do cicode, abra o arquivo Treinamento.ci Escreva uma função chamada
AudAlarm(). Esta função irá reproduzir um arquivo wav e mostrará um quadro de
mensagem.
2. Defina o Scope, a declaração e o nome da função
PUBLIC
FUNCTION
AudAlarm()
3. Utilize a função DspPlaySound() para reproduzir o arquivo wav FT1800ALF.wav. Este
arquivo se encontra dentro do diretório de projeto
PUBLIC
FUNCTION
AudAlarm()
DspPlaySound(“[RUN]: TT4200CH.wav”,0);
4. Adicione a função Message() para mostrar uma mensagem de advertência ao mesmo
tempo. Termine (END) a função.
PUBLIC
FUNCTION
AudAlarm()
DspPlaySound(“[RUN]: TT4200CH.wav”,0);
Message(“ATENCAO OPERADOR”, “ALTA TEMPERATURA^n GERADOR 3”, 48);
END
5. Utilize um evento para ativar a função quando HTA (Holding Tube Alarm) tenha a
condição .H (ALTA) ou .HH (ALTA ALTA).
6. Abra o Editor de Projetos do Vijeo Citect e selecione no menu System|Events.
7. Adicione um evento de alarme que ative esta função quando o Holding Tube Alarm
76
=!1 &
8. Utilize o Computer Setup Wizard no modo Custom Setup para ativar o evento de
alarme conforme mostrado abaixo.
# / &
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.
77
=!1 &
Desde que tags de variáveis estão habilitados para armazenar informação, eles podem ser
utilizados em suas funções de Cicode. Entretanto, se você deseja armazenar algum dado
temporariamente e não deseja utilizar um tag de variável da base de dados do Vijeo Citect,
você deve declarar e fazer uso de uma variável do Cicode.
As variáveis do Cicode podem armazenar os seguintes tipos básicos de dados:
- STRINGS;
- INTEIROS;
- REAIS;
Cada variável é específica para seu tipo de dados. Por exemplo, se você fizer o setup de uma
variável para armazenar um valor inteiro, você não pode utilizá-la para armazenar valores
reais ou do tipo strings.
Conseqüentemente, se você pretende utilizar uma variável em uma de suas funções do
cicode, você precisa declarar o tipo de dado que esta variável irá utilizar. Você também
precisa declaração a localização desta variável.
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. A figura abaixo ilustra:
No exemplo anterior, a função foi criada para retornar a média de dois números. O Cicode
não sabe que tipo de dado estará contido na média. Conseqüentemente, você precisa
informar o cicode que tipo de dado a média irá retornar. Por isso é necessário incluir a
linha INT Media; de forma a fazer com que o cicode saiba que tipo de dado a média irá
retornar.
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:
78
=!1 &
# / 8*'#
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)
As variáveis Globais do Cicode possuem como prefixo a palavra chave GLOBAL. É
recomendado que elas sejam declaradas no início de um arquivo do Cicode. Por exemplo:
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
A variável sPaginaDefault poderia então ser utilizada em qualquer função de qualquer
arquivo do Cicode no sistema.
79
=!1 &
Você deve utilizar variáveis Globais com cautela no seu sistema – se você tem
muitas destas variáveis sendo utilizadas por muitas funções, procurar por problemas
quando depurando seu programa pode tomar muito tempo. Utilizem variáveis
Locais sempre que possível.
# / *
# - *
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.
As variáveis do tipo Module devem ser declaradas antes das funções que farão uso delas,
por exemplo:
MODULE STRING sPaginaDefault = "Mimic";
Isto estabelece que o valor inicial para sPaginaDefault é “Mimic”. Ele pode então ser
utilizado por todas as funções no arquivo corrente.
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
Você deve, assim como para variáveis Globais, fazer um uso moderado das
variáveis ditas Modulares – Se você tem muitas destas variáveis sendo utilizadas
por diversas funções, procurar por problemas quando depurando seu programa
pode tomar muito tempo. Utilizem variáveis Locais sempre que possível.
80
=!1 &
# / &#
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.
Qualquer variável definida dentro de uma função (por exemplo, depois do nome da
função é uma variável local, portanto não necessita de prefixo).
As variáveis Locais são destruídas quando a função deixa de existir.
As variáveis Locais sempre têm precedência sobre as variáveis Globais e Modulares.
Se você define uma variável Local em uma função com o mesmo nome que uma
variável Global ou Module, a variável Local será utilizada. As variáveis Global/Module
não são afetadas pela função. Esta situação deve ser evitada, dado que possivelmente
irá causar confusão, ambigüidade e com certeza pesadelos quando da manutenção das
rotinas.
EXEMPLO:
PUBLIC
INT
FUNCTION
ExemploLocal(INT a, INT b)
INT iMedia
iMedia = (a + b) /2;
RETURN iMedia
END
# 1 H #! ' ! % ##
# /
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
Para maiores informações sobre padrões, veja Citect Help Topics - Variable Naming
Standards.
#$ # /
Você pode utilizar qualquer variável que tenha declarado na base de dados (no formulário
Variable Tags) em suas funções. Elas foram utilizadas no exercício 1-1. Para fazer uso de
uma variável da base de dados, especifique o nome do tag da seguinte form:
81
=!1 &
<Tag>
Onde <Tag> é o nome da variável da base de dados. Por exemplo, para alterar o
valor da variável VEL_MOINHO da base de dados, você utilizaria a seguinte
declaração em sua função:
, &)
& 6-4
Depure três diferentes funções do Cicode
1. Abra o arquivo do Cicode denominado “Ch4Bugs.ci” e visualize seus componentes.
2. Retire os comentários de uma função por vez, compile o projeto e depure os erros
encontrados. As funções a serem depuradas são AreaofCircle(), ShowPrompt () e
Average ().
, &)
& 6-6
Crie outra função de alarme sonoro com variáveis locais
1. A função existente deveria ter um aspecto similar a este:
PUBLIC
FUNCTION
AudAlarm()
DspPlaySound("[RUN]: TT4200CH.wav",0);
FUNCTION
AudAlarm2()
DspPlaySound(sFile,0);
END
4. Declare as variáveis internas utilizadas acima dentro dos parênteses do nome da função
conforme mostrado abaixo
82
=!1 &
PUBLIC
FUNCTION
DspPlaySound(sFile,0);
END
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
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
, &)
& 6-:
Utilize a função RealToStr() o valor do tag TIC_HOLD_PV em uma mensagem emergente.
1. Abra a página Treinamento e crie um botão denominado Holding Tube abaixo do texto
Capítulo 5.
2. Adicione a função Message() a entrada ÙP Command com o tab horizontal Input e o tab
vertical Touch selecionados.
84
=!1 &
, &)
& 6-;
Crie uma função que lhe permita utilizar um quadro de entrada para introduzir um valor do
tipo string, que em seguida seja transferido para um tag inteiro.
1. Crie uma nova função denominada OperatorInput().
FUNCTION
OperatorInput()
2. Adicione a função Input() conforme mostrado abaixo:
FUNCTION
OperatorInput()
Input(“Entrada de Valores”,”Insira Valor Desejado”, “”);
3. Vamos definir uma variável local do cicode denominada sTag para receber o valor
retornado pela Input().
FUNCTION
OperatorInput()
STRING sTag = “”;
sTAg = Input(“Entrada de Valores”,”Insira Valor Desejado”, “”);
4. Adicione uma instrução para transferir o valor de sTag para o tag LIC_SILO_PV.
FUNCTION
OperatorInput()
STRING sTag = “”;
sTAg = Input(“Entrada de Valores”,”Insira Valor Desejado”, “”);
LIC_SILO_PV = sTag;
85
=!1 &
FUNCTION
OperatorInput()
STRING sTag = “”;
sTAg = Input(“Entrada de Valores”,”Insira Valor Desejado”, “”);
LIC_SILO_PV = StrToInt(sTag);
END
6. Crie um novo botão na sua página de Treinamento denominado Input. Adicione a função
acima no Up command.
10. O objeto de texto LIC_SILO_PV mostrará o input realizado pelo operador conforme
mostrado abaixo:
86
=!1 &
, &)
& 6->
Crie um arquivo de inclusão (Include File) para poder utilizar a função AudAlarm2() criada
anteriormente como ação em um Evento.
1. Abra o Notepad do Windows.
2. Crie um arquivo denominado Alarms.cii. Salve este arquivo dentro do seu diretório de
projeto.
4. Abra o Editor de Projetos do Vijeo Citect e crie um evento para executar a função
AudAlarm2() quando o alarme HTA alcançar seu estado BAIXO ou BAIXO BAIXO.
5. Adicione o evento abaixo ao formulário. Não se esqueça de executar o Computer Setup
Wizard para assegurar-se de que os eventos estão habilitados.
88
:
,& ! & !#
89
,& ! & !#
90
,& ! & !#
'( #) *
Neste capítulo você irá aprender sobre:
• Os quatros executores condicionais:
- IF
- FOR
- WHILE
- SELECT CASE.
3 &*
## " =
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
Exemplo:
// O seguinte fragmento de código utiliza uma declaração IF
FUNCTION TestaServer()
STRING sServer;
!Se o flag de heartbeat FOR 0, quer dizer que o server não está mudando !ele. Nós
temos que assumir a escrita
iflagbooleana = 1;
ELSE
!Se o flag = 1, então o server está rodando. Zera ele para detectar na !próxima vez
iflagheartbit = 0;
iflagbooleana = 0;
END
END
END
Para o formato IF THEN as declarações são apenas executadas se a expressão é TRUE (1).
O formato IF THEN ELSE é utilizado para ramificação. As declarações TRUE são executadas
se a expressão é TRUE. De outra forma, as declarações FALSE é que serão executados.
Você também pode encadear declarações IF. Mas se você tem diversas declarações IF’s,
então você deve considerar a utilização das declarações SELECT CASE.
, &)
& :-
Escreva uma função do Cicode que utilize a instrução IF THEN ELSE.
1. Crie uma função denominada IF_Example1.
2. Utilize a instrução IF THEN ELSE para abrir um quadro de mensagem que venha a
mostra as mensagens running ou stopped dependendo do status do tag
CENTRIFUGE_CMD.
FUNCTION
IF_EXAMPLE1()
IF CENTRIFUGE_CMD =1 THEN
Message(“Clarifier Status”, “Running”,64);
ELSE
Message(“Clarifier Status”, “Stopped”,64);
END
END
, &)
& :-+
92
,& ! & !#
Escreva uma função do Cicode que utilize a instrução IF THEN ELSE que use variáveis
locais do Cicode
1. Copie a função que criou no exercício anterior e cole abaixo da mesma. Dê o nome de
IF_Example2() para a nova função.
2. Declare variáveis para o tag, para o título e para as mensagens de entrada e saída dentro
dos parênteses do nome da função conforme mostrado abaixo.
IF_Example2(INT iTag1, STRING sTitle, STRING sOnMessage, STRING sOffMessage)
3. Substitua as variáveis originais pelas variáveis que você acabou de declarar.
FUNCTION
IF_EXAMPLE2(INT iTag1, STRING sTitle, STRING sOnMessage, STRING
sOffMessage)
IF iTag1 =1 THEN
Message(sTitle, sOnMessage,64);
ELSE
Message(sTitle, sOffMessage,64);
END
END
4. Crie um botão na página Treinamento chamado STATUS^n AGITADOR SILO.
=
O loop FOR é utilizado para executar um conjunto de declarações um determinado número
de vezes.
93
,& ! & !#
, &)
& :-0
Crie as seguintes funções abaixo dentro de sua pasta Treinamento.ci.
1. Crie uma função denominada FOR_Example1() que incremente o tag LIC_BALANCE_PV
de LIC_BALANCE_PV a LIC_BALANCE_SP.
2. Crie uma função denominada FOR_Example2() que decremente o tag
LIC_BALANCE_PV de LIC_BALANCE_PV a LIC_BALANCE_SP.
3. Crie uma terceira função denominada FOR_Example3() que altere o valor do tag
LIC_BALANCE_PV a LIC_BALANCE_SP independentemente se LIC_BALANCE_PV é
maior ou menor que LIC_BALANCE_SP.
Neste terceiro exercício procure utilizar IF THEN ELSE com FOR
IJ
O loop WHILE é utilizado para executar declarações de forma repetitiva enquanto a
declaração condicional é TRUE (1).
WHILE Expressao DO
Statement(s);
END
Por exemplo:
// O seguinte fragmento de código utiliza o loop WHILE:
FUNCTION AnimaMaq()
94
,& ! & !#
hTask1 = TaskNew("AnimacoesMaq1","",4+8);
, &)
& :-4
Crie as seguintes funções abaixo dentro de sua pasta Treinamento.ci.
1. Crie uma função denominada WHILE_Example1() que decremente o tag
LIC_BALANCE_PV enquanto PUMP_FEED_CMD seja TRUE e faça a
LIC_BALANCE_PV = 100 quando PUMP_FEED_CMD for FALSE.
2. Adicione uma condição extra na rotina acima de tal forma que faça LIC_BALANCE_PV =
100 quando LIC_BALANCE_PV <20.
3. Crie um botão na página Treinamento de forma a comprovar a função.
3 &*
## "
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.
95
,& ! & !#
, &)
& #! # :-6
Escreva uma função do Cicode chamada QueDiaeHoje() e que utiliza a declaração
SELECT CASE;
96
,& ! & !#
1. Utilize a função Input() para aceitar um número entre 0 e 6. Você deve checar se um
número válido foi inserido, ecoando uma mensagem na linha de Prompt se ocorrer um
número inválido. Sua declaração SELECT CASE deverá atribuir ao tag de variável
STRING1 o dia da semana representado pelo número, por exemplo, 0 representaria
Domingo, 1 representaria segunda-feira e assim sucessivamente.
2. Defina a função:
FUNCTION
QueDiaeHoje()
STRING sInput = “” ;
INT iDelivery_day;
sInput =Input(“Entrada Valores”, “Insira Valor Desejado”,””);
iDelivery_day = StrToTInt(sInput)
SELECT CASE iDelivery_day
CASE 0
STRING1 = “SUNDAY”;
CASE 1
STRING1 = “MONDAY”;
CASE 2
STRING1 = “TUESDAY”;
CASE 3
STRING1 = “WEDNESDAY”;
CASE 4
STRING1 = “THURSDAY”;
CASE 5
STRING1 = “FRIDAY”;
CASE 6
STRING1 = “SATURDAY”;
CASE ELSE
Message(“ERRO”, “DADO INVALIDO”, 64)
END SELECT
END
97
,& ! & !#
98
;
# .! 1 &
99
# .! 1 &
100
# .! 1 &
'( #) *
Neste capítulo você ira aprender
• Funções do Tipo Return;
• Depuração de código;
• Arrays;
• Comentários.
=!1 !
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 função Time() é uma função do tipo Return. Ela retorna a hora
corrente que poderia ser utilizada em um relatório. Funções do tipo Return são tipicamente
utilizadas para mostrar informações em relatórios, alarmes, etc e para retornar handles
(manipuladores), erros codificados em números, etc.
Uma função do tipo Return requisita que uma resposta retorne para você. If você está para
dizer para alguém “Como vai você?”, então o valor esperado de retorno poderia ser “Estou
bem!”.
Em pseudocódigo, esta função poderia ser como a mostrada abaixo:
DIALOGO
FUNCTION
ComoVaiVoce()
RETURN Estou Bem;
END
101
# .! 1 &
PUBLIC
INT
FUNCTION
ExemploReturn (INT a, INT b)
INT iMedia; Esta é uma
iMedia = (a + b) /2
variável local já
RETURN iMedia;
END
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
ExemploReturn(TAG1 , TAG2);
expression
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.
Por isto necessitamos das funções do tipo Return.
, &)
& ;-
Crie uma função do tipo Return denominada AverageEx2().
1. Localize no arquivo Treinamento.ci a função AverageEx1() criada anteriormente. O
código deveria ter o seguinte aspecto.
FUNCTION
AverageEx1()
TIC_P2_PV = (TIC_P1_PV + TIC_P4_PV)/2
END
2. Copie e cole esta função em um novo arquivo de cicode. Salve este novo arquivo como
MoreFunctions.ci.
3. Converta esta função em uma função do tipo Return. Primeiro adicione o tipo de dado de
devolução.
INT
FUNCTION
AverageEx2()
TIC_P2_PV = (TIC_P1_PV + TIC_P4_PV)/2
END
4. Defina uma variável local para receber o resultado da operação. Adicione em seguida o
comando Return.
INT
FUNCTION
102
# .! 1 &
AverageEx2()
INT iMedia;
iMedia = (TIC_P1_PV + TIC_P4_PV)/2;
Return iMedia;
END
5. Salve seu arquivo. Crie um botão na página Treinamento abaixo do texto Capítulo 7 que
chame esta função e devolva o resultado no tag TIC_P3_PV.
6. Salve sua página e compile o projeto.
7. Crie outra função de devolução que utilize somente variáveis locais do Cicode para
calcular o valor médio de dois tags.
8. Copie o código anterior e cole abaixo a função AverageEx2(). Altere o nome da função
para AverageEx3().
9. Troque os tags TIC_P1_PV e TIC_P4_PV pelas variáveis locais iTagX e iTagY.
10. Defina estas variáveis dentro dos parentes conforme mostrado anteriormente.
INT
FUNCTION
AverageEx3(INT iTagX, INT iTagY)
INT iMedia;
iMedia = (iTagX + iTagY)/2;
Return iMedia;
END
12. Salve o arquivo. Crie um botão na página Treinamento abaixo do texto Capítulo 7 que
calcule o valor médio dos tags TIC_P4_PV e TIC_HW_PV e devolva o resultado em
TIC_HOLD_PV.
103
# .! 1 &
, &)
& ;-+
Converta a função OperatorInput() em uma função do tipo Return.
1. Copie a função OperatorInput() criada anteriormente no arquivo Treinamento.ci e salve
com o nome EnterTagValue() na pasta MoreFunctions.ci.
FUNCTION
EnterTagValue()
STRING sTag;
sTAg = Input(“Entrada de Valores”,”Insira Valor Desejado”, “”);
LIC_SILO_PV = StrToInt(sTag);
END
2. Converta a função em uma função do tipo Return.
INT
FUNCTION
EnterTagValue()
STRING sTag;
sTAg = Input(“Entrada de Valores”,”Insira Valor Desejado”, “”);
Return StrToInt(sTag);
END
3. Salve seu arquivo.
4. Abra a página Treinamento e adicione a nova função aos objetos de texto dos tags INT,
por exemplo:
INT1 = EnterTagValue()
5. Salve a página e compile o projeto.
, &)
& ;-0
Converta a função OperatorInput() em uma função do tipo Return.
1. O arquivo Ch7Bugs.ci contem três funções com pequenos erros. Depure estas funções.
3. Elimine o comentário de uma função por vez, compile o projeto e depure os erros.
#K
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
104
# .! 1 &
Considere uma fila de unidades habitacionais numeradas com A,B,C e D. Esta fila é como um
array e cada uma das unidades é um elemento deste array. Cada elemento contém um valor.
Neste exemplo comparativo, cada unidade contém um numero de pessoas.
O array poderia ser nomeado da seguinte forma:
Apartamento[4]
desde que existem 4 elementos no array. No Cicode, os arrays são numerados a partir do
zero (0). Desta forma, nós poderíamos fazer referência a cada uma das unidades da seguinte
forma:
UNIT A Apartamento[0]
UNIT B Apartamento[1]
UNIT C Apartamento[2]
UNIT D Apartamento[3]
! #,
Os arrays possuem a seguinte 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];
Este array contém 05 elementos. O compilador multiplica o número de elementos no array
pelo tamanho de cada elemento (que depende do tipo de dado utilizado) e aloca posições de
memória consecutiva para armazenagem do array.
! &#*2#! % #K
105
# .! 1 &
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"
3% ! 1 #K
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:
*2#! #K
Algumas coisas importantes quando utilizando arrays são:
• 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”;
, &)
& ;-4
Escreva uma função do tipo Return denominada RecipeSelection() que most a descrição
de uma receita.
1. Declare a nova função e designe um nome. O valor retornado será do tipo STRING.
STRING
FUNCTION
RecipeSelection()
2. Crie um Array de STRING que defina as descrições de texto das receitas de leite.
STRING sRecipeArray[5] = “FULL CREAM”, “LITE”, “SPORT”, “SKIM”, “HIGH PROTEIN”
STRING
FUNCTION
RecipeSelection()
3. Crie duas variáveis locais de Cicode, uma para o nome da receita como STRING e outra
para o número da receita como INT.
107
# .! 1 &
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).
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.
% !/
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++:
108
# .! 1 &
C # 7 #: D
D
E & $
" F G
109
# .! 1 &
110
>
& 3 ' $$
111
& 3 ' $$
112
& 3 ' $$
O Editor do Cicode pode funcionar no modo Debug (depuração) para analisar códigos do
Cicode quando sendo executado. Para se depurar rotinas em Cicode, necessitamos que o
Vijeo Citect esteja sendo executado, conseqüentemente você pode ativar e desativar a
depuração quando necessário. A operação do Debugger é controlada através das opções de
Debug, com algumas opções apenas tendo efeito durante o startup.
'( #) *
Neste capítulo você ira aprender
• Como iniciar o Debugger;
• Sobre as opções de Debug;
• A depurar um código do Cicode.
%' ! &
Para aprender mais sobre o Debugger, nós iremos utilizar o arquivo do Cicode denominado
Debug.ci parte integrante de nosso projeto de treinamento.
Para abrir o arquivo DEBUG.CI proceda da seguinte forma:
, &)
& >-
O Debugger do Citect detecta automaticamente erros de hardware que ocorrem nas
funções do Cicode. Neste exercício, você irá utilizar o arquivo debug.ci para testar o
Citect Debugger.
1. Abra a barra de ferramentas debug.
2. 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:
113
& 3 ' $$
3. 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.
4. 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.
114
& 3 ' $$
8. 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.
9. Também verá uma lista das variáveis de memória e seus valores atuais na Stack
Window.
10. 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.
115
& 3 ' $$
11. Retorne ao Editor do Cicode e olha a Stack Window. O número introduzido será mostrado
na variável sPizzaNumber.
12. 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.
13. Repita passo a passo pelas instruções até que as linhas que atribuem valores as
variáveis sPizzaName e sPizzaPrice sejam executadas.
14. 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.
, &)
& >-+
116
& 3 ' $$
DevFind(hDev,sPizzaNumber,"Number");
3. Troque a string Number por Num :
DevFind(hDev,sPizzaNumber,"Num");
4. Salve o arquivo e compile o projeto. Dado que se trata de uma string, o código será
compilado sem problemas. Como não existe um campo chamado Num no device, a
função irá gerar um erro neste ponto quando o código for executado.
5. Execute o projeto
6. Inicie o depurador.
8. Utilize o botão Step Into para executar o código linha a linha. Quando se executar a
linha DevFind, a mensagem de erro abaixo será ecoada na tela.
# $ ! L #! #! * &C $
Quando tenha detido um subprocesso, o depurador marcará como vimos anteriormente o
código com uma flexa amarela. A partir daí, podemos avançar pela função linha a linha e
observar o que ocorre nas janelas de depuração (consulte a seguir). 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á).
117
& 3 ' $$
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.
, &)
& >-0
Utilize as funções de passo a passo avançadas do depurador para avançar por uma função.
1. Volte ao arquivo Debug.ci e localize a função CheckTag().
3. Crie um botão na página Treinamento abaixo do texto Capítulo 8 denominado Check Tag
para chamar a função CheckTag().
4. Compile seu projeto e execute-o.
8. A flexa passará para a função SetValues(). Ao utilizar o botão Step Into , cada linha
da função acima será executada.
118
& 3 ' $$
9. Quando a execução da função for completada, o depurador voltará a função que fez a
chamada.
10. Escreva o nome de um tag quando aparecer o quadro de entrada. Clique no boão OK
para continuar avançando pelo código.
11. Continue avançando por cada linha. O depurador voltará a função que realizou a
chamada original.
119
& 3 ' $$
, &)
& >-4
Utilize a função avançada para passo a passo procedimento e passo a passo para sair das
funções.
1. Inicie a função CheckTag().
2. Quando o depurador se deter no breakpoint, entre em cada linha até entrar na primeira
linha da função SetValues().
3. Agora, em vez de executar esta função linha a linha, selecione o botão Step Out .
120
& 3 ' $$
4. Isto fará com que o restante da função SetValues(). Em seguida, o depurador voltará a
função que realiza a chamada no ponto imediatamente após a chamada de SetValues().
7. Esta vez, em vez de entrar na função TagRead(), selecione o botão Step Over .
8. Em lugar de entrar na função TagRead(), o depurador permitirá que a função seja
executada e fará uma pausa na linha de código seguinte da função CheckTag().
4.
9. Clique no botão continuar para executar o restante do código.
121
& 3 ' $$
122
D! &
A&! &# $ #%# "
##
123
A&! &# $ #%# " ##
124
A&! &# $ #%# " ##
As rotinas escritas em Cicode até agora foram simples e com um mínimo de lógica requerida.
Entretanto, os programas mais complexos requerem um caminho mais estruturado para
facilitar a programação, a depuração e a manutenção.
'( D! &
Ao final deste capítulo você aprenderá:
• Como utilizar pseudocódigos ;
• Como utilizar diagramas de fluxo.
3 #$ #%# C$ & =* ,
Existem inúmeras técnicas disponíveis para assistir ao programador no sentido de projetar
um código estruturado. A mais simples e comumente técnica utilizada é o diagrama de fluxo.
Esta técnica se aplica bem a todos os tipos de sistemas, independentemente se médios ou
de grande complexidade. Isto significa que programadores familiarizados com escrita de
código para PLC’s podem utilizar as mesmas habilidades para escrever códigos para o Vijeo
Citect.
O principio básico do diagrama lógico de fluxo está centralizado no croqui que detalhe o fluxo
do programa através de vários estágios. O diagrama de fluxo consiste em quatro principais
componentes:
Blocos de Decisão
Blocos de Execução
Faça Contagem = 10
Caminhos Condicionais
SIM
Loop retorn
Exemplo A:
125
A&! &# $ #%# " ##
Abaixo podemos ver um diagrama de fluxo mostrando o fluxo lógico para checar se um
determinado valor está dentro de um range (entre 1 e 10). Se estiver dentro do range, atribua
o valor para o tag. Se não, mostre a string de mensagem “Range inválido”.
Valor
SIM
Valor é > 10? Prompt “Range é inválido”
NÃO
SIM
Valor é < 1? Prompt “Range é inválido”
NÃO
Retorna o valor
Este é um exemplo simples, entretanto ele mostra que deste croqui, uma pequena rotina
pode facilmente ser escrita utilizando os operadores condicionais (IF, WHILE, FOR) para
executar corretamente a lógica desejada.
Exemplo B:
Uma rotina mais complexa pode ser necessária para, ou fechar o formulário ou executar uma
tarefa se um botão é pressionado, qualquer que ocorrer primeiro. Esta tarefa poderia ser
representada como o seguinte diagrama de fluxo:
126
A&! &# $ #%# " ##
Contagem = 0
SIM
Contagem é > 60? Feche o formulário
NÃO
SIM
Botão Pressionado? Executa a tarefa
NÃO
Contagem = Contagem+1
O único inconveniente do diagrama de fluxo é sua manutenção após cada pequena alteração
na estrutura do programa, depois de inicialmente confeccionado. Além disso, são
normalmente colocados em um documento separado dos códigos, de tal forma que você
deverá sempre visualizar os dois documentos ao mesmo tempo.
Uma solução mais elegante para projetar e documentar uma tarefa seria a utilização de
pseudocódigos.
127
A&! &# $ #%# " ##
!&* "
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.
128
D! &
8 # $ #%# " ! &
129
8 # $ #%# " ! &
130
8 # $ #%# " ! &
Neste Apêndice nós iremos definir as linhas guias para a produção de código de funções
CICODE pelo usuário.
'( D! &
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.
! "
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.
3 .! 1 ! !1 %
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
131
8 # $ #%# " ! &
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;
• A quinta parte é um comentário opcional que fornece um breve comentário
da variável;
INT cTendTipoPeriodic = 1;
132
8 # $ #%# " ! &
INT cTendTipoEvent = 2;
• 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.
=!1
As funções do Cicode podem possuir até seis partes:
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.
Por exemplo;
FUNCTION
PlotInit()
<Declarações>
END
INT
FUNCTION
PlotOpen(STRING sName, INT nMode)
INT hPlot = BAD_HANDLE;
.
hPlot = …..;
.
RETURN hPlot;
END
STRING
FUNCTION
133
8 # $ #%# " ! &
//********************* CONSTANTES**************************
//*********************************************************
<funções>
Variáveis Globais devem ser utilizadas com cautela. Se estas variáveis são utilizadas por
muitas funções, achar bugs em seu programa pode tomar muito tempo. Variáveis locais (da
função) devem ser utilizadas sempre que possível.
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
134
8 # $ #%# " ! &
= %# 3 &*
## 1 $ #%#
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;
Declarações do tipo IF podem ser utilizadas em um dos formatos abaixo. Quando utilizando
uma declaração IF, utilize um TAB.
135
8 # $ #%# " ! &
• Bloco IF simples
IF <expressão> THEN
.
.
END
• Bloco IF-THEN-ELSE
IF <expressão> THEN
.
.
ELSE
.
.
END
Quaisquer dos estilos abaixo podem ser utilizados por blocos ELSEIF.
IF <expressão> THEN
.
.
ELSE
IF <expressão> THEN
.
.
ELSE
IF <expressão> THEN
.
.
ELSE
.
.
END
END
END
• In line
IF <expressão> THEN
.
.
ELSE IF <expressão> THEN
.
.
ELSE IF <expressão> THEN
.
.
ELSE
.
END END END
136
8 # $ #%# " ! &
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
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
% !/
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.
$ #%# " 3 . ! #
• 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;
• Cheque se terminações de loop são óbvios e alcançáveis;
• Nunca escreva um código duas vezes. Se você achar que duas sessões do código
parecem idênticas ou quase idênticas, vale a pena gastar tempo para reescrevê-la ou
reprojetá-la. Isto irá certamente cortar o tamanho do código em um terço ou mais,
137
8 # $ #%# " ! &
138
D! &
H M ( & 3
139
H M ( & 3
140
H M ( & 3
O Vijeo Citect suporta o padrão ODBC (Open DataBase Connectivity). Muitos fabricantes de
pacotes de base de dados fornecem atualmente um driver ODBC para o seu pacote de
software. Além deles, fabricantes independentes também disponibilizam drivers ODBC para
uma vasta variedade de Base de Dados. Um desses fornecedores é a Intersolv Q+E com o
seu DataDirect ODBC Pack. Na maioria dos casos, entretanto, qualquer driver ODBC
funcionará para a sua base de dados.
'( D! &
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.
# # 3#
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. Para criar uma base de dados, siga as instruções
abaixo:
I ! N 7 - ,% *
• Acesse o Windows Control Painel conforme mostrado abaixo:
141
H M ( & 3
142
H M ( & 3
143
H M ( & 3
Observe que a Fonte de Dados criada agora aparece listada na lista disponibilizada nesta
figura. Pressione o botão OK para encerrar este procedimento. Feche o Windows Control
Panel.
Isto é tudo o que você necessita fazer. Você acabou de criar uma fonte de dados (Data
Source) que está pronta para ser utilizada de dentro do Vijeo Citect.
% & ! &# # # # 3# #
( &
144
H M ( & 3
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.
*2#! # *# =! H
& H &*
# .. !& !
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.
,% * )& %# ! ," H K
A query abaixo mostra como localizar e obter dados de uma determinada base de dados
denominada Personnel:
INT
FUNCTION
GetNames()
INT hSQL;
STRING sName;
INT Status;
Algumas coisas a se observar é que para toda conexão via SQLConnect() deverá também
existir uma instrução de desconexão via SQLDisconnect(). Geralmente, uma conexão ODBC
demanda certo tempo, especialmente quando conectando clientes em rede sendo servidos
por um servidor de base de dados. Por esta razão, você deve evitar ficar conectando e
desconectando frequentemente.
145
H M ( & 3
Outro ponto importante a destacar é que para cada query feita via SQLExec(), você deve
eventualmente também chamar a função SQLEnd() de forma a liberar memória utilizada por
aquela query.
Finalmente, você deve verificar sempre o handle de retorno de todas as funções SQLxxx()
para verificar se foram executadas com sucesso e se for o caso, tomar alguma providência.
Para maiores informações sobre o porque da falha da função SQL, chame a função
SQLErrMsg().
% / H
Esta seção fornece um rápido resumo sobre Structured Query Language (SQL). Para
maiores informações, favor fazer referência a texto específico. A maioria dos pacotes de
software de base de dados que suportam SQL queries terão maiores informações. Uma boa
parte desta seção está focada em mostrar instruções através de exemplos. Todos estes
exemplos estarão baseados nas seguintes tabelas:
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
Tabela COUNTRY
PERSONID COUNTRY
654 Hungary
854 Jamaica
935 Australia
367 Cuba
746 Denmark
153 Portugal
946 Jamaica
479 Ethiopia
294 Thailand
3 &*
## "
146
H M ( & 3
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>]
Quando especificando mais de um campo ou tabela, você deve delimitá-los por vírgulas.
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” );
CNAME
Observe que nada foi selecionado. Você pode, entretanto utilizar a função SQL UPPER()
para contornar este problema.
147
H M ( & 3
Nem todos os sistemas de base de dados ou seus drivers ODBC irão necessariamente
suportar a função UPPER(). Verifique a documentação disponível.
CNAME
Jill
H '# # # % & !( ! # -
#
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:
CNAME PERSONID
Jill 854
Englebert 479
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
CNAME PERSONID
Jill 854
Englebert 479
H K!$ % #!$ #* - #
I
É possível especificar um range em um query utilizando-se o operador BETWEEN conforme
mostrado abaixo:
149
H M ( & 3
H K!$ #' *
# 5* *
# - !! #
#' *
#
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.
CNAME FETISH
Jill Jewels
James Juice
Quando querying múltiplas tabelas, pode ser necessário utilizar qualificadores quando
referenciando nomes de campos. Isto pode ser necessário quando ambas as tabelas tem
campos de mesmo nome. Isto pode ser observado nos exemplos acima quando fazemos
referência ao campo PERSONID. A declaração foi prefixada com FETISH.’ e ‘COUNTRY.’
quando necessário.
&*
## "
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>, ...)
150
H M ( & 3
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’ ) ” );
&*
## " 3
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>]
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” );
151
H M ( & 3
&*
## " 3
Para apagar registros em uma tabela de base de dados, utilize a declaração DELETE. A
sintaxe para esta declaração está mostrada abaixo:
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’” );
3 &*
# #! 3# # J #! H
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’.
152
H M ( & 3
! #, 3# #PJ # ! ! ! #
3#
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’]
153
H M ( & 3
154
D! & 3
,% * C $
$ #%#
155
,% * &C $ $ #%#
156
,% * &C $ $ #%#
'( D! &
Ao final deste apêndice, você poderá:
• Visualizar rotinas de programas do Cicode e, portanto se tornar mais
familiarizado com o mesmo.
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
Exemplo C.2
Retorna a media entre os Tags de Variáveis INT1 e INT2
INT
FUNCTION
MyAverage()
Return ((INT1 + INT2) /2);
END
Exemplo C.3
Atribui ao parâmetro [MESSAGE]Test do arquivo USER.INI uma determinada String
FUNCTION
PutINI()
STRING sValue;
END
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
157
,% * &C $ $ #%#
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;
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
Exemplo C.7
Esta função faz o Tag STRING1 receber o dia da semana
STRING
FUNCTION
WhatDayIsIt()
STRING sDay;
INT iDay;
END
159
,% * &C $ $ #%#
160