A norma define a semântica e sintaxe da linguagem Texto Estruturado. Nesta linguagem, o fim da linha de texto deve ser tratado do mesmo modo que o caractere espaço (SP – space).
Expressões
Uma expressão é uma construção que, quando executada, fornece um valor correspondente a um dos tipos de dados definidos na norma.
Expressões são compostas de operadores e operandos. Um operando pode ser
1. um literal 2. uma variável
3. uma invocação de função 4. outra expressão
Os operadores da linguagem de Texto Estruturado estão resumidos na norma. A avaliação de uma expressão consiste em aplicar o operador ao operando, em uma seqüência definida pela precedência do operador. O operador com precedência mais alta em uma expressão deve ser aplicado primeiro, seguido pelo operador da próxima precedência mais baixa, até completar a avaliação. Operadores de igual precedência devem ser aplicadas como escrito na expressão, da esquerda para a direita. Por exemplo, se A, B, C e D são do tipo INT com valores 1, 2, 3 e 4, respectivamente, então:
A+B-C*ABS(D)
deve ser avaliado como –9 e
(A+B-C)*ABS(D) deve ser avaliado como 0.
Quando um operador tem dois operandos, o operando mais à esquerda deve ser avaliado primeiro. Por exemplo, na expressão
SIN(A)*COS(B)
A expressão SIN(A) deve ser avaliada primeira, seguida por COS(B), seguida pela avaliação do produto dos dois.
Expressões booleanas devem ser avaliadas somente para a extensão necessária para determinar o valor resultante. Por exemplo, se A<=B, então somente a expressão A>B seria avaliada para determinar que o valor da expressão
A>B)&(C<D) é o booleano 0.
Funções devem ser invocadas como elementos de expressões consistindo do nome da função seguido pelo argumento entre parêntesis.
Quando um operador em uma expressão pode ser representado como uma das funções sobrecarregadas, a conversão dos operados e resultados devem ser as regras e exemplos dados na norma.
Comando (Statement)
Os tipos de comandos da linguagem de texto estruturado são sumarizados na Tab. 56. O comando deve ser terminado por ponto de virgula (;).
Comando de atribuição (assignment statement)
O comando de atribuição substitui o valor corrente de uma variável simples ou multi-elemento pelo resultado da avaliação de uma expressão. Ele consiste de uma variável de referência à esquerda, seguida pelo operador de atribuição “:=”, seguido pela expressão a ser avaliada. Por exemplo, o comando
A := B ;
Deve ser usado para substituir o valor do dado de uma variável A pelo valor corrente da variável B, se ambos forem do tipo INT. Porém, se ambos A e B forem do tipo ANALOG_CHANNEL_CONFIGURATION, então os valores de todos os elementos da variável estruturada A devem ser
substituídos pelos valores correntes dos elementos correspondentes da variável B.
Como ilustrado na fig. 6, o comando atribuição pode ser também usado para atribuir o valor a ser retornado pela função, colocando nome da função para a
esquerda de um operador de atribuição no corpo da declaração da função. O valor
retornado pela função deve ser o resultado da avaliação mais recente de tal atribuição. É um erro retornar da avaliação de uma função com a saída ENO diferente de zero, a não ser que, no mínimo, tal atribuição tenha sido feita.
Comandos de controle de função e blocos de função
Comandos de controle de função e blocos de função consistem de
mecanismos para invocar blocos de função e para controlar o retorno da entidade de invocação, antes do fim físico de uma função ou bloco de função.
A avaliação da função deve ser invocada como parte da avaliação de expressão.
Blocos de função devem ser invocados por um comando consistindo do nome do bloco de função, seguido por uma lista de atribuições de valores de parâmetros de entrada entre parêntesis, como mostrado na Tab. 56. A ordem em que os
parâmetros de entrada são listados em uma invocação de bloco de função não é importante. Não é necessário que todos os parâmetros de entrada tenham valores atribuídos em cada invocação de um bloco de função. Se um determinado parâmetro não tem atribuído um valor em uma invocação de bloco de função, será aplicado o valor atribuído anterior (ou o valor inicial, se não houver nenhum anterior definido).
O comando RETURN dá a saída de uma função ou bloco de função, e.g., como o resultado da avaliação de um comando IF.
Comando de Seleção
Os comandos de seleção incluem o IF e CASE. Um comando de seleção escolhe um ou um grupo de seus comandos componentes para execução, baseado em uma condição especificada. Exemplos de comandos de seleção são dados na Tab. 56.
O comando IF especifica que um grupo de comandos deve ser executado somente se a expressão booleana associada é verdadeira (resultado da avaliação é 1). Se a condição é falsa, então nenhum outro comando é executado ou o grupo de
comando seguindo o ELSE (senão) é executado.
O comando CASE consiste de uma expressão que avalia variáveis do tipo INT e uma lista de grupos de comando, cada grupo sendo identificado por um ou mais inteiros ou faixas de valores inteiros. Ele especifica que o primeiro grupo de comandos, uma destas faixas contém o valor computado pelo seletor, deve ser executado. Se o valor do seletor não ocorre em uma fase de qualquer caso, a seqüência do comando seguindo a palavra chave ELSE, caso ela ocorra, deve ser executada. Nos outros casos, nenhuma das seqüências de comandos é executada. Comandos interativos
Comandos iterativos especificam que o grupo de comandos associados deve ser executado repetidamente. O comando FOR é usado se o número de iterações pode ser determinado a priori, nos outros casos, as construções WHILE (enquanto) ou REPEAT (repetir) são usadas.
O comando EXIT (sair) deve ser usado para terminar iteacoes antes que a
condição de terminação seja satisfeita. Quando o comando EXIT é localizado dentro de construções iterativas
encadeadas, a saída será da malha mais interna em que o EXIT esteja localizado, isto é, o controle passa para o comando seguinte depois do terminados da primeira malha (END_FOR, END_WHILE ou END_REPEAT) seguindo o comando EXIT. Por exemplo, depois de executar os comandos mostrados na Fig. 22, o valor da variável SUM deve ser 15, se o valor da variável booleana FLAG é 0 e 6 se FLAG = 1.
SUM := 0 ;
FOR I := 1 TO 3 DO FOR J := 1 TO 2 DO
IF FLAG THEN EXIT ; END_IF
SUM :- SUM + J END_FOR ;
SUM := SUM + i ; END_FOR :
O comando FOR indica que a seqüência de comandos deve ser executada repetidamente, até a palavra chave END_FOR enquanto a progressão dos valores é atribuída para a variável de controle da malha FOR. A variável de controle, valor inicial e valor final devem ser expressões do mesmo tipo de inteiro (SINT, INT ou DINT) e não podem ser alteradas por qualquer um dos comandos repetidos. O comando FOR incrementa a variável de controle para cima ou para baixo de um valor inicial até um valor final, em incrementos determinados pelo valor de uma expressão; este valor default é 1. O teste para a condição de terminação é feito no início de cada iteração, de modo que a seqüência de comando não é executada se o valor inicial excede o valor final. O valor da variável de controle depois de terminar a malha FOR é dependente da implementação.
Um exemplo do uso do comando FOR é dado na característica 6 da Tab. 56. Neste exemplo, a amlha FOR é usada para detrminar o índice J da primeira ocorrência (se existir) do string KEY nos elementos de número impar de uma matriz de strings WORDS com uma faixa de índice de 1 a 100. Se nenhuma ocorrência é verificada, J terá o valor 101.
O comando WHILE causa a seuencia de comandos até a palavra chave
END_WHILE ser executada repetidamente até a expressão booleana associada ser falsa. Se a expressão é inicialmente falsa, então o grupo de comandos não é
executado. Por exemplo,
FOR..._END_FOR pode ser reescrito usando o WHILE...END_WHILE, como mostrado em Tab. 56.
Os comandos WHILE e REPEAT não podem ser usados para conseguir a sincronização dentro do processo, por exemplo, como uma malha WAIT com uma condição de terminação determinada externamente. Os elementos do diagrama de função seqüencial são usados com este objetivo.
É um erro que viola a norma ter um comando WHILE ou REPEAT em um algoritmo para que a satisfação da condição de terminação da malha ou execução de um comando EXIT não possa ser garantida.