• Nenhum resultado encontrado

PCLink6

N/A
N/A
Protected

Academic year: 2021

Share "PCLink6"

Copied!
54
0
0

Texto

(1)

PCLink for Windows - Versão 6.0

Serial e Ethernet

(2)

1 Introdução... 5

2 HardKey ... 6

3 Hardkey servidor ... 7

4 Escrevendo programas... 8

5 Comunicação via porta serial (COM) do computador... 8

5.1 Comunicação via ethernet ... 10

5.1.1 Pinagem dos canais seriais... 11

5.1.2 Sinais de controle CTS / RTS... 11

5.1.3 Loop de corrente Ativo / Passivo... 11

5.1.4 Pinagem das entradas e saídas digitais ... 12

6 Declarações para PCLink6.Dll ... 13

6.1 Display_Erro ... 13

6.2 Seta_Ip... 13

6.3 W9091 ... 13

6.4 W9091Serial... 14

6.5 Considerações sobre 9091 contador ... 14

6.6 W9091C... 15

6.7 W9091SerialC ... 16

6.8 WOhaus ... 16

6.9 WOhausSerial... 16

6.10 Indicador Challenger MSI3360 ... 17

6.11 WMSI3360 ... 18 6.12 WMSI3360Serial... 18 6.13 Programando MSI 6260... 19 6.14 WMSI6260 ... 19 6.15 WMSI6260Serial... 19 6.16 ProgSerial ... 20 6.17 Select_Canal... 20 6.18 Close_Canal... 20 6.19 Deleta_Canal ... 21 6.20 Update_Canal ... 21 6.21 Update_NoMotion... 22 6.22 Gross_canal ... 22 6.23 Net_canal... 23 6.24 Tare_canal ... 23 6.25 Estado_Canal... 23 6.26 Estado_EmMovimento ... 24 6.27 ClrBufRx ... 24 6.28 ClrBufTx ... 24 6.29 CloseLicense ... 25

6.30 Considerações sobre Entradas/Saídas digitais da FIREX... 25

6.31 DIO_InPort... 25 6.32 DIO_InPortStr ... 26 6.33 DIO_InBit... 26 6.34 DIO_InBitStr ... 26 6.35 DIO_OutPort ... 27 6.36 DIO_OutPortStr... 27 6.37 DIO_OutBit ... 27 6.38 DIO_OutBitStr ... 28 7 Exemplos de programação ... 29 7.1 Delphi 6 ... 29

7.1.1 Código fonte Delphi6 ... 30

7.2 Exemplo VB 6 ... 44

(3)
(4)
(5)

1 Introdução

O PCLink 6.0 vem substituir as versões anteriores do produto, porém, introduzindo a

comunicação via ethernet para leitura de balanças seriais (RS232 ou Loop de corrente)

através de uma placa FIREX.

A FIREX se aplica quando a aplicação do cliente requer ambiente de monitoramento

remoto, (sistemas de segurança, automação de fábrica, SCADA, transporte de dados, etc.).

Ou seja, de um micro qualquer da fábrica, ou de todos os micros, o cliente precisa:

- ligar/desligar sinalização remota... semáforos...abrir e fechar válvulas...

- saber a posição (status) dos sinais de campo... sensores fotoelétricos, chaves fim de

curso, sensores de posicionamento...

- ler peso de balanças

As vantagens da FIREX são :

- Padronizar o meio físico de comunicação (Ethernet)...

- Facilitar instalação e Reduzir custo de tubulação e fiação...

- Reduzir os problemas de interferências e descargas atmosféricas.

- Todos os micros da rede podem acessar a mesma FIREX, porém , com algumas

limitações.

Limitações da FIREX :

- Só é possível uma conexão, por canal serial da FIREX, ou seja, dois computadores

não conseguem ler a mesma balança ao mesmo tempo. Para isso, um computador

deve fazer sua leitura e fechar a conexão, permitindo que outro computador na rede

possa efetuar uma leitura de balança.

- É permitido até 7(sete) conexões para fazer a leitura de entradas, acionamento das

saídas e programação dos canais seriais.

- O tráfego na rede ethernet está diretamente ligado ao desempenho da comunicação.

Para casos críticos, vale fazer a segmentação da rede para deixar a leitura das

balanças independente de qualquer outra informação.

Esta nova versão da PCLink 6, permite a leitura das balanças tanto serialmente quanto via

ethernet, através de funções que são disponibilizadas em uma DLL chamada

PCLink6.DLL.

Observação importante :

(6)

2 HardKey

Para utilizar a DLL PCLink6 será necessário utilizar uma Hardkey. A mesma hardkey pode

ser utilizada local (uma por computador) ou em rede. A escolha se deve conforme a área e

necessidade de cada cliente. Para citar alguns exemplos, podemos ter as seguintes

configurações :

• Leitura de balanças, utilizando porta serial, tendo uma hardkey local por

computador. Modo ideal de trabalho, para não depender de sua rede ethernet.

• Leitura de balanças, utilizando porta serial, tendo apenas uma hardkey em algum

computador da rede ethernet.

Bal 1 Bal 2 Bal 3 Bal n

Computador 1 com hardkey e multiserial

Bal 1 Bal 2 Bal 3 Bal n

Computador 2 com hardkey e multiserial

Bal 1 Bal 2 Bal 3 Bal n

Computador 1 com multiserial

Bal 1 Bal 2 Bal 3 Bal n

Computador 2 com multiserial

Computador 3

A hardkey pode estar em um deste três computadores, que estará trabalhando com um serviço ou programa gerenciador de conexões. A melhor opção é um computador que não precise ser desligado.

Rede Ethernet

(7)

3 Hardkey servidor

Para ser utilizada em rede, deve ser escolhido um computador onde será instalada a hardkey

fornecida pela Toledo e coloca-la na porta paralela. Executando o programa SetupPCLink6

do CDRom de instalação irá instalar alguns programas no menu Iniciar\PCLink6 :

• FirexTool

Programa para configuração das placas Firex. A placa vem com IP 10.0.0.1 de

fábrica.

• SerialIP

Programa teste para leitura de balanças em porta serial ou de canais de Firex,

contém inclusive os fontes em Delphi.

• SetupHardkey

Programa instalador da hardkey em rede. Este programa verifica o sistema

operacional do computador e disponibiliza os tipos de instalação que podem ser

feitas, serviço para NT/Windows 2000(SrvProteq) ou programa gerenciador para

qualquer sistema operacional(GerHardkey). Este programa também deve ser

utilizado para desinstalar a hardkey, quando necessitar trocar a hardkey para outro

computador. Caso esta instalação não seja realizada, a hardkey será apenas para o

computador onde está conectada. Nos computadores que precisarem acessar a

hardkey remotamente, basta executar este programa, e seguir os passos para

instalação remota, onde a principal exigência é o nome do computador onde a

hardkey está instalada.

• SrvProteq

Serviço NT/Win 2000 para gerenciar o controle de licenças da hardkey. Este

serviço é instalado automaticamente quando se utiliza o programa SetupHardkey.

Caso necessite instalá-lo manualmente , basta entrar na tela de prompt , ir no

diretório onde está o programa SrvProteq e digitar “SrvProteq /install” se precisar

desinstalar digite “SrvProteq /Uninstall” . Para iniciar e parar o serviço deve ser

feito manualmente.

• GerHardkey

Programa para qualquer sistema operacional para gerenciar o controle de licenças da

hardkey. Este programa é instalado automaticamente quando se utiliza o programa

SetupHardkey.

• ToledoMonitor

Este programa só deverá funcionar nos computadores onde está instalado a hardkey

com o programa SetupHardkey. Este é apenas um programa de monitoração

relacionado a hardkey. Pode ser utilizado para determinar se o serviço/programa

gerenciador da hardkey está funcionando, se o programa executável desenvolvido

pelo cliente está conseguindo uma conexão com a hardkey, e exibe algumas

mensagens de erro , se acontecerem.

(8)

4 Escrevendo programas

Daremos a seguir algumas explicações sobre como efetuar uma leitura via um canal serial

ou via ethernet, já mostrando algumas funções que pertencem a DLL. Como exemplo,

utilizaremos o indicador Toledo 9091. Para exemplificar para qualquer tipo de linguagem

de programação, colocarei uma exclamação(!) como comentário e tratarei como uma

linguagem genérica. Utilizarei algumas variáveis do tipo String para obtermos pesos de

tara, bruto, liquido e estado da balança. Essas variáveis são terminadas com nulo.

5 Comunicação via porta serial (COM) do

computador

Para fazer esta comunicação, precisamos ter uma porta válida para o sistema operacional.

Utilizando a função específica para cada balança, fazemos uma conexão serial para o 9091 :

! vamos fazer uma conexão para COM3

! utilizaremos uma variável do tipo inteiro,

! para obter o retorno da função.

! isto deve ser feito apenas uma vez, na inicialização

! do programa

B3 := W9091Serial(3) ;

! esta variável B3 é muito importante, pois será nossa

! ligação com a balança e seu protocolo. Ao testar o

! retorno dessa função, saberemos se obtivemos uma

! conexão válida.

! SE B3 MENOR QUE ZERO , temos um erro de conexão

if B3 < 0 then

Display(“Não foi possível conectar com a balança x”);

Return;

End if;

! O próximo passo será testar se a conexão continua

! válida, para efetuar uma leitura de peso.

(9)

! SE SELECT_CANAL(B3) DIFERENTE DE 0

if Select_Canal(B3) <> 0 then

! Faremos uma leitura de balança com ou sem

! movimento sobre a balança

! poderia ser utilizado a função update_nomotion

! se fosse necessário ler um peso estável.

ret := Update_Canal(B3);

! Após a leitura, testamos o retorno

if ret = 0 then

! obtemos o peso bruto

bruto := Gross_canal(B3);

! obtemos o peso de tara

tara := Tare_canal(B3);

! obtemos o peso liquido

liq := Net_canal(B3);

! obtemos o estado da leitura. Estável ou instável

smov := Estado_EmMovimento(B3);

! obtemos outros estados da balança

sEst := Estado_Canal(B3);

end if;

end if;

Como pôde se ver, a leitura é relativamente simples. Verifique a descrição detalhada de

todas as funções utilizadas no exemplo. Na instalação do programa se encontra um diretório

onde tem um programa exemplo em Delphi.

(10)

5.1 Comunicação via ethernet

Como foi descrito anteriormente, leremos uma balança através da placa FIREX. A placa

FIREX possui 4(quatro) canais de comunicação (A,B,C,D) e 8(oito)entradas digitais(0 a 7)

e 8(oito) saídas digitais(0 a 7). Verifique a fig.1 :

Fig. 1 – Modelo placa Firex

Observação : Para maiores detalhes técnicos, consulte o manual da placa Firex, que

acompanha o disco de instalação.

(11)

5.1.1 Pinagem dos canais seriais

A seguir está indicado a pinagem de cada canal, conforme o tipo:

5.1.2 Sinais de controle CTS / RTS

Se for utilizar sinais de controle para RS232, pode ser observado na fig.1 o conjunto

correspondente para cada canal, e somente os canais A,B e C possuem o controle de fluxo

por hardware. Os pinos 1 e 2 são para RTS e 3 e 4 para CTS.

No canal A, ao se utilizar o controle de fluxo fará com que a placa não deixe mais

disponível para o usuário a entrada 6 e saída 6.

No canal B, ao se utilizar o controle de fluxo fará com que a placa não deixe mais

disponível para o usuário a entrada 5 e saída 5.

No canal C, ao se utilizar o controle de fluxo fará com que a placa não deixe mais

disponível para o usuário a entrada 4 e saída 4.

A conclusão é que a leitura destas entradas e a escrita nessas saídas, não pode ser

considerado após ativar o controle de fluxo.

5.1.3 Loop de corrente Ativo / Passivo

Para a configuração de Ativo/Passivo para loop de corrente, utilize o conjunto de pinos a

frente de cada canal como demonstrado na fig 1, e faça a configuração conforme abaixo:

Fig 2 – Configuração de Ativo/Passivo

Pinos 20mA RS232

1 Tx

IN

TxD

2 Tx

OUT

RTS

3 Rx

IN

RxD

4 Rx

OUT

CTS

5 — Gnd

(12)

5.1.4 Pinagem das entradas e saídas digitais

A seguir está indicado a pinagem das entradas e saídas :

Pinos E/S 0 a 3 E/S 4 a 7

1 GND GND 2 +10V +10V 3 IN0 IN4 4 IN1 IN5 5 IN2 IN6 6 IN3 IN7 7 In– In– 8 OUT0 OUT4 9 OUT1 OUT5 10 OUT2 OUT6 11 OUT3 OUT7 12 OUT+ OUT+

Conexão para entradas e saídas :

OUT+ OUTn INn IN– + + -OUT0 IN0 Ri 3K3 Saídas Entradas

Características:

Saídas = 24VDC, 100mA;

Entradas = 7mA @ 24VDC.

(13)

6 Declarações para PCLink6.Dll

Aqui temos as declarações das funções e sua utilização :

6.1 Display_Erro

Utilizada para exibir mensagens que a DLL carrega quando ocorre algum erro na operação

que o usuário quer executar.

Parâmetros :

IP_SETADO – Valor inteiro retornado da função Seta_Ip correspondente a

um IP para comunicação.

Retorno :

Retorna um pointer de caracter, com uma mensagem para melhor

identificação do problema.

Sintaxe em C :

char * Display_Erro( int IP_SETADO);

Sintaxe em Delphi :

function Display_Erro(IP_SETADO : Integer) : PChar; stdcall;

6.2

Seta_Ip

Utilizada para informar à DLL o IP da placa FIREX que será utilizada para comunicação.

Esta função retorna um valor inteiro que será muito utilizado nas demais operações da

DLL.

Parâmetros :

IPStr – IP para comunicação com máximo de 15 bytes, no formato

XXX.XXX.XXX.XXX (o valor default da placa é 10.0.0.1).

Retorno :

Retorna um valor inteiro de 0 a n, para identificar cada IP utilizado na

comunicação.

Sintaxe em C :

int Display_Erro( char * IPStr);

Sintaxe em Delphi :

function Seta_Ip(IPStr : PChar): Integer; stdcall;

6.3 W9091

Utilizada para informar à DLL que um determinado canal de uma placa FIREX, será

alocado para leitura de um indicador 9091 com protocolo P03, checksum habilitado, 4800

baud, 7 bit, paridade par e 1 stop bit.

Parâmetros :

IP_SETADO – Valor inteiro retornado da função Seta_Ip correspondente a

um IP para comunicação.

(14)

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

int W9091( int IP_SETADO, char * Canal);

Sintaxe em Delphi :

function W9091(IP_SETADO : Integer; Canal : PChar): Integer; stdcall;

6.4 W9091Serial

Utilizada para informar à DLL que uma determinada porta serial, será alocada para leitura

de um indicador 9091 com protocolo P03, checksum habilitado, 4800 baud, 7 bit, paridade

par e 1 stop bit.

Parâmetros :

COM – Valor inteiro correspondente a uma porta serial para comunicação.

COM1 = 1, COM2 = 2 e assim por diante.

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

int W9091Serial( int COM);

Sintaxe em Delphi :

function W9091Serial(COM : Integer): Integer; stdcall;

6.5 Considerações sobre 9091 contador

O 9091 contador, envia pacotes de dados sobre demanda, ou seja, quando a tecla print for

pressionada e a balança completamente estabilizada. Para fazer essa comunicação deve

haver um sincronismo entre o momento que será enviado os dados e o programa que

receberá essas informações. Para iniciar, programe seu 9091 com a seguinte configuração

das chaves de software :

--- --- chave de

SOFTWARE valor

--- ---

C00 (L) modo contador ativo

C02 (d) impressão automática desabilitada C03 (d) sensor de movimento desativado C05 (d) modo rede desativado

C10 (d) imprime pesos BRUTO, TARA e LÍQUIDO C11 (L) envia os dados em uma única linha C12 (L) envia o CHECKSUM no pacote de dados C14 (P04) seleciona o tipo de pacote a enviar

C15 (d) transmissão contínua desativada - modo demanda C25 (L) ativa o uso da tecla F2

C28 (L) ativa o envio da data e hora da pesagem C31 (L) envia o código digitado pelo operador C32 (L) identifica a tara manual

(15)

Após essa configuração, utilizar as funções W9091C para Firex ou W9091SerialC para

porta serial. Para fazer a leitura utilizar a função Contadora_Canal.

Exemplos :

Para iniciar a conexão via ethernet Firex :

Sip := Seta_IP('192.168.211.17');

if Sip >= 0 then

begin

// a conexão será no canal B da Firex

Canal := W9091C(Sip,'B');

end;

Fazendo a conexão via porta serial COM 1 :

Canal := W9091SerialC(1);

Após a conexão ser realizada, utilizar a leitura quantas vezes for necessário com as funções:

ret := Update_Canal(Canal);

que aguardará um tempo default do pacote de dados

ou

ret := Update_NoMotion(Canal,Tempo);

que determinará um tempo de espera.

A função Contadora_canal(Canal) retorna o pacote de dados obtido, similar ao seguinte :

30/01/94 16:30 000000 402,2kg 00,133kg PMP 03035 PCS

As funções de líquido, bruto e tara não tem funcionalidade para este driver.

Verifique o programa exemplo que acompanha o disco de instalação e realize alguns testes

para entender o funcionamento.

6.6 W9091C

Utilizada para informar à DLL que um determinado canal de uma placa FIREX, será

alocado para leitura de um indicador 9091 contador com checksum habilitado, 4800 baud,

7 bit, paridade par e 1 stop bit. Verificar sobre configuração do indicador.

Parâmetros :

IP_SETADO – Valor inteiro retornado da função Seta_Ip correspondente a

um IP para comunicação.

Canal – Canal de comunicação da placa FIREX (A,B,C ou D).

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

(16)

Sintaxe em Delphi :

function W9091C(IP_SETADO : Integer; Canal : PChar): Integer; stdcall;

6.7

W9091SerialC

Utilizada para informar à DLL que uma determinada porta serial, será alocada para leitura

de um indicador 9091 contador com checksum habilitado, 4800 baud, 7 bit, paridade par e

1 stop bit. Verificar sobre configuração do indicador.

Parâmetros :

COM – Valor inteiro correspondente a uma porta serial para comunicação.

COM1 = 1, COM2 = 2 e assim por diante.

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

int W9091SerialC( int COM);

Sintaxe em Delphi :

function W9091SerialC(COM : Integer): Integer; stdcall;

6.8 WOhaus

Utilizada para informar à DLL que um determinado canal de uma placa FIREX, será

alocado para leitura de uma balança Ohaus programada para 9600 baud, 7 bit, paridade par

e 1 stop bit. A balança não precisa ser programada para transmitir continuamente.

Parâmetros :

IP_SETADO – Valor inteiro retornado da função Seta_Ip correspondente a

um IP para comunicação.

Canal – Canal de comunicação da placa FIREX (A,B,C ou D).

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

int WOhaus( int IP_SETADO, char * Canal);

Sintaxe em Delphi :

function WOhaus(IP_SETADO : Integer; Canal : PChar): Integer; stdcall;

6.9

WOhausSerial

Utilizada para informar à DLL que uma determinada porta serial, será alocada para leitura

de de uma balança Ohaus programada para 9600 baud, 7 bit, paridade par e 1 stop bit. A

balança não precisa ser programada para transmitir continuamente.

(17)

Parâmetros :

COM – Valor inteiro correspondente a uma porta serial para comunicação.

COM1 = 1, COM2 = 2 e assim por diante.

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

int WOhausSerial(int COM);

Sintaxe em Delphi :

function WOhausSerial(COM : Integer): Integer; stdcall;

6.10 Indicador Challenger MSI3360

Para utilizar o indicador MSI3360 com o PCLink 6, é necessário que seja feito uma

programação no indicador conforme descrito abaixo.

Menu RS232

FOr

dAtA

01 40 (@)

02 53 (S)

03 40 (@)

04 56 (V)

05 32 (2)

06 40 (@)

07 56 (V)

08 33 (3)

09 40 (@)

10 56 (V)

11 34 (4)

12 40 (@)

13 55 (U)

14 40 (@)

15 45 (E)

16 00

StLin

01 02 (Stx)

02 00

Endln

01 03 (Etx)

02 00

StrnG

Str U

odE

OutPt

Cntr

Conti

Caracter de início Bruto Líquido Tara Unidade Caracter de fim Fim de data

Caracter de início, usado por @S Fim de StLin

Caracter de fim, usado por @E Fim de EndLin

User-defined string

(18)

otion

OFF

intEr

OnCE

SEt

bAud

9600

StoP

1 bit

dbitS

8 bit

PAr

nonE

HAnd

nonE

Após toda essa programação ser realizada, o indicador estará apto a ser lido serialmente ou

via ethernet.

6.11 WMSI3360

Utilizada para informar à DLL que um determinado canal de uma placa FIREX, será

alocado para leitura de um indicador Challenger MSI3360 programado conforme o ítem 6.7

Parâmetros :

IP_SETADO – Valor inteiro retornado da função Seta_Ip correspondente a

um IP para comunicação.

Canal – Canal de comunicação da placa FIREX (A,B,C ou D).

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

int WMSI3360( int IP_SETADO, char * Canal);

Sintaxe em Delphi :

function WMSI3360(IP_SETADO : Integer; Canal : PChar): Integer; stdcall;

6.12 WMSI3360Serial

Utilizada para informar à DLL que uma determinada porta serial, será alocada para leitura

de um indicador MSI3360, programado conforme o ítem 6.7.

Parâmetros :

COM – Valor inteiro correspondente a uma porta serial para comunicação.

COM1 = 1, COM2 = 2 e assim por diante.

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Motion desabilitado Intervalo desabilitado Baud rate Stop bit Bits de dados Paridade Sem handshake

(19)

Sintaxe em C :

int WMSI3360Serial(int COM);

Sintaxe em Delphi :

function WMSI3360Serial(COM : Integer): Integer; stdcall;

6.13 Programando MSI 6260

Programar para 1200 baud e continuo em RS232.

Fechar os seguintes switches S2-1, S2-2, S2-7, S3-1, S3-2, S3-6, S3-7 .

Abrir ose seguintes jumpers J14-3, J14-6, J14-7, J14-8 .

6.14 WMSI6260

Utilizada para informar à DLL que um determinado canal de uma placa FIREX, será

alocado para leitura de um indicador Challenger MSI6260 programado conforme o ítem 6.7

Parâmetros :

IP_SETADO – Valor inteiro retornado da função Seta_Ip correspondente a

um IP para comunicação.

Canal – Canal de comunicação da placa FIREX (A,B,C ou D).

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

int WMSI6260( int IP_SETADO, char * Canal);

Sintaxe em Delphi :

function WMSI6260(IP_SETADO : Integer; Canal : PChar): Integer; stdcall;

6.15 WMSI6260Serial

Utilizada para informar à DLL que uma determinada porta serial, será alocada para leitura

de um indicador MSI6260, programado conforme o manual do fabricante

Parâmetros :

COM – Valor inteiro correspondente a uma porta serial para comunicação.

COM1 = 1, COM2 = 2 e assim por diante.

Retorno :

Retorna um valor inteiro de 0 a n, para identificar o canal utilizado na

comunicação.

Sintaxe em C :

int WMSI6260Serial(int COM);

Sintaxe em Delphi :

(20)

6.16 ProgSerial

Utilizada para alterar algum parâmetro de configuração da porta serial de algum dos drivers

de balança. Utilizar após obter um número de um dos drivers de porta serial. Esta alteração

só deve ser realizada se desejar trabalhar fora dos padrões estabelecidos por fábrica.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091Serial, por exemplo) para realizar a

leitura do indicador ou balança.

Baud – Baudrate que deseja utilizar

Dados – Databits da porta serial (5,6,7 ou 8)

Paridade – Paridade da porta serial (0-Sem, 1-Impar ou 2-Par)

Stop – Stop Bits da porta serial (1 ou 2)

Retorno :

Sem retorno

Sintaxe em C :

void ProgSerial( int canal,baud,dados,paridade,stop);

Sintaxe em Delphi :

procedure ProgSerial(Canal,Baud,Dados,Paridade,Stop : integer); stdcall;

6.17 Select_Canal

Utilizada para abrir a conexão TCP/IP quando a comunicação é realizada através de uma

FIREX.

Parâmetros :

Canal_Setado – Valor inteiro correspondente ao número do canal fornecido

por alguma das funções de balança(W9091, por exemplo) para realizar a

leitura do indicador ou balança.

Retorno :

0 - Indica que a conexão já havia sido realizada.

1 – Indica que a conexão foi realizada.

Sintaxe em C :

int Select_Canal( int CANAL_SETADO);

Sintaxe em Delphi :

function Select_Canal(CANAL_SETADO : Integer) : integer; stdcall;

6.18 Close_Canal

Fecha a conexão com o canal serial ou TCP/IP.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança.

(21)

Sintaxe em C :

void Close_Canal( int Canal);

Sintaxe em Delphi :

procedure Close_Canal(Canal : integer); stdcall;

6.19 Deleta_Canal

Deleta a conexão com o canal serial ou TCP/IP.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança. Este comando livra a memória alocada pela

conexão.

Retorno : Sem retorno

Sintaxe em C :

void Deleta_Canal( int Canal);

Sintaxe em Delphi :

procedure Deleta_Canal(Canal : integer); stdcall;

6.20 Update_Canal

Faz a leitura da balança ou indicador, correspondente ao canal passado como parâmetro. O

peso sobre a balança pode estar estável ou instável.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança.

Retorno :

0 - Indica que a leitura foi válida

1 - Indica que não foi possível efetuar a leitura da balança.

3 – Indica que há sobrecarga sobre a balança. Exemplo : na plataforma de

um indicador 9091, é colocado 26 kg , que tem uma carga máxima de 25kg.

O display apaga , mas o indicador continua transmitindo. Isto deve ser

considerado como erro.

999 – Indica que não conseguiu detectar a hardkey local ou de rede.

Sintaxe em C :

int Update_Canal( int Canal);

Sintaxe em Delphi :

(22)

6.21 Update_NoMotion

Faz a leitura da balança ou indicador, correspondente ao canal passado como parâmetro. O

peso sobre a balança deve estar estável. Esta função não tem validade para o indicador

Challenger MSI3360.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança.

Tempo - Contado em milisegundos ( 1000ms = 1 segundo)

Valor 0(Zero) - Aguardará até a estabilização da balança

Valores acima de zero, aguardará o tempo passado

Valor –1 será utilizado o tempo default da DLL

Retorno :

0 - Indica que a leitura foi válida

1 - Indica que não foi possível efetuar a leitura da balança.

2 – Indica que expirou timeout para efetuar a leitura sem movimento.

3 – Indica que há sobrecarga sobre a balança. Exemplo : na plataforma de

um indicador 9091, é colocado 26 kg , que tem uma carga máxima de 25kg.

O display apaga , mas o indicador continua transmitindo. Isto deve ser

considerado como erro.

999 – Indica que não conseguiu detectar a hardkey local ou de rede.

Sintaxe em C :

int Update_NoMotion( int Canal, int Tempo);

Sintaxe em Delphi :

function Update_NoMotion(Canal : integer;Tempo : integer) : Integer;

stdcall;

6.22 Gross_canal

Obtém o peso bruto, após utilizar a função Update_Canal ou Update_NoMotion, se não

utilizar nenhuma das funções obterá o último peso lido.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança.

Retorno :

Peso bruto

Sintaxe em C :

char * Gross_canal( int Canal);

Sintaxe em Delphi :

(23)

6.23 Net_canal

Obtém o peso líquido, após utilizar a função Update_Canal ou Update_NoMotion, se não

utilizar nenhuma das funções obterá o último peso lido.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança.

Retorno :

Peso líquido

Sintaxe em C :

char * Net_canal( int Canal);

Sintaxe em Delphi :

function Net_Canal(Canal : integer) : PChar; stdcall;

6.24 Tare_canal

Obtém o peso tara, após utilizar a função Update_Canal ou Update_NoMotion, se não

utilizar nenhuma das funções obterá o último peso lido.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança.

Retorno :

Peso tara

Sintaxe em C :

char * Tare_canal( int Canal);

Sintaxe em Delphi :

function Tare_Canal(Canal : integer) : PChar; stdcall;

6.25 Estado_Canal

Obtém alguns estados da balança, após utilizar a função Update_Canal ou

Update_NoMotion, se não utilizar nenhuma das funções obterá o último estado.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança.

Retorno:

Para W9091 será recebido uma string com o seguinte pacote:

Incremento da balança

: 1,2 ou 5

NetMode

: S = Sim; N = Não ; E = Erro

Peso negativo

: S = Sim; N = Não ; E = Erro

Sobrecarga

: S = Sim; N = Não ; E = Erro

Peso em movimento

: S = Sim; N = Não ; E = Erro

Unidade da balança

: kg ou lb; EE = Erro

(24)

Botão print pressionado

: S = Sim; N = Não; E = Erro

Obs : Para uma balança Ohaus, por exemplo, não se determina

alguns desses campos como Incremento, unidade, etc. Nesses

casos o retorno será ’E’ apenas para indicar que não existe valor

determinado.

Sintaxe em C :

char * Estado_canal( int Canal);

Sintaxe em Delphi :

function Estado_Canal(Canal : integer) : PChar; stdcall;

6.26 Estado_EmMovimento

Obtém se o peso está em movimento sobre a balança, após utilizar a função Update_Canal ,

se não utilizar a função obterá o último estado.

Parâmetros :

Canal – Valor inteiro correspondente ao número do canal fornecido por

alguma das funções de balança(W9091, por exemplo) para realizar a leitura

do indicador ou balança.

Retorno:

Para W9091 será recebido uma string com S = Sim; N = Não

Sintaxe em C :

char * Estado_EmMovimento( int Canal);

Sintaxe em Delphi :

function Estado_EmMovimento(Canal : integer) : PChar; stdcall;

6.27 ClrBufRx

Limpa buffer de recepção apenas para placas Firex.

Parâmetros :

IP_SETADO – Valor inteiro retornado da função Seta_Ip correspondente a

um IP para comunicação.

Canal – Canal de comunicação da placa FIREX (A,B,C ou D).

Retorno :

Retorna um valor inteiro de 0 para sucesso e –1 se ocorreu erro.

Sintaxe em C :

int ClrBufRx( int IP_SETADO, char * Canal);

Sintaxe em Delphi :

function ClrBufRx(IP_SETADO : integer; Canal : PChar): integer; stdcall;

6.28 ClrBufTx

Limpa buffer de transmissão apenas para placas Firex.

Parâmetros :

IP_SETADO – Valor inteiro retornado da função Seta_Ip correspondente a

um IP para comunicação.

(25)

Canal – Canal de comunicação da placa FIREX (A,B,C ou D).

Retorno :

Retorna um valor inteiro de 0 para sucesso e –1 se ocorreu erro.

Sintaxe em C :

int ClrBufTx( int IP_SETADO, char * Canal);

Sintaxe em Delphi :

function ClrBufTx(IP_SETADO : integer; Canal : PChar): integer; stdcall;

6.29 CloseLicense

Fecha licensa de uso em relação a hardkey server. Esta função só deve ser utilizada ao

encerrar um aplicativo para liberar rapidamente a conexão com a hardkey, caso contrário o

programa ou serviço que gerencia a hardkey server irá fechar essa conexão depois de

alguns segundos.

Sintaxe em C :

void CloseLicense(void);

Sintaxe em Delphi :

procedure CloseLicense; stdcall;

6.30 Considerações sobre Entradas/Saídas digitais da FIREX

• Cada PIM (placa de entrada/saída) contém duas entradas e duas saídas.

• Se o jumper JP7 pinos 1 e 2 não estiver jumpeado, não será possível ler a

entrada 7.

• Se utilizar controle de fluxo por hardware no canal A, a entrada 6 e a saída 6

não poderão ser utilizadas.

• Se utilizar controle de fluxo por hardware no canal B, a entrada 5 e a saída 5

não poderão ser utilizadas.

• Se utilizar controle de fluxo por hardware no canal C, a entrada 4 e a saída 4

não poderão ser utilizadas.

6.31 DIO_InPort

Utilizada para ler todas as entradas e obter seu retorno em um valor inteiro.

Parâmetros :

Nip – Valor inteiro retornado da função Seta_Ip correspondente a um IP para

comunicação.

Retorno :

-1 indica que não foi possível ler as entradas ou retorna um valor inteiro de

0 a 255, setando os bits de 0 a 7 cuja entrada correspondente estiver ligada.

Sintaxe em C :

int DIO_InPort( int Nip);

Sintaxe em Delphi :

(26)

6.32 DIO_InPortStr

Utilizada para ler todas as entradas e obter seu retorno em uma String.

Parâmetros :

Nip – Valor inteiro retornado da função Seta_Ip correspondente a um IP para

comunicação.

Retorno :

Retorna EEEEEEEE indicando que não foi possível ler as entradas ou

retorna uma string conforme a tabela abaixo.

Ent 0 Ent 1 Ent 2 Ent 3 Ent 4 Ent 5 Ent 6 Ent 7

Ligado S S S S S S S S

Desligado

N N N N N N N N

Sintaxe em C :

Char * DIO_InPort( int Nip);

Sintaxe em Delphi :

function DIO_InPortStr(Nip : integer): PChar; stdcall;

6.33 DIO_InBit

Utilizada para ler uma determinada entrada e obter seu retorno em um valor inteiro.

Parâmetros :

Nip – Valor inteiro retornado da função Seta_Ip correspondente a um IP para

comunicação.

Retorno :

-1

- indica que não foi possível ler a entrada.

0

- entrada desligada.

1

- entrada ligada.

Sintaxe em C :

int DIO_InBit( int Nip, int Entrada);

Sintaxe em Delphi :

function DIO_InBit(Nip : integer;Entrada : integer): Integer; stdcall;

6.34 DIO_InBitStr

Utilizada para ler uma determinada entrada e obter seu retorno em uma String.

Parâmetros :

Nip – Valor inteiro retornado da função Seta_Ip correspondente a um IP para

comunicação.

Retorno :

E

- indica que não foi possível ler a entrada.

N

- entrada desligada.

S -

entrada

ligada.

Sintaxe em C :

(27)

Sintaxe em Delphi :

function DIO_InBitStr(Nip : integer; Entrada : integer): PChar; stdcall;

6.35 DIO_OutPort

Utilizada para escrever em todas as saídas simultaneamente através de um parâmetro

inteiro.

Parâmetros :

Nip – Valor inteiro retornado da função Seta_Ip correspondente a um IP para

comunicação.

Palavra – Valor inteiro a ser escrito nas saídas.

Retorno :

-1

- indica que não foi possível escrever nas saídas

0

- placa recebeu o comando de alteração das saídas.

Sintaxe em C :

int DIO_OutPort( int Nip, int Palavra);

Sintaxe em Delphi :

function DIO_OutPort(Nip : integer;Palavra : integer): Integer; stdcall;

6.36 DIO_OutPortStr

Utilizada para escrever em todas as saídas simultaneamente através de um parâmetro string.

Parâmetros :

Nip – Valor inteiro retornado da função Seta_Ip correspondente a um IP para

comunicação.

Palavra – Valor string a ser escrito nas saídas, conforme tabela abaixo.

Ent 0 Ent 1 Ent 2 Ent 3 Ent 4 Ent 5 Ent 6 Ent 7

Ligar S S S S S S S S

Desligar N N N N N N N N

Para ligar as saídas 0 e 5 e desligar as demais o valor palavra seria

SNNNNSNN .

Retorno :

-1

- indica que não foi possível escrever nas saídas

0

- placa recebeu o comando de alteração das saídas.

Sintaxe em C :

int DIO_OutPortStr( int Nip,char * Palavra);

Sintaxe em Delphi :

function DIO_OutPortStr(Nip : integer;Palavra : PChar): integer; stdcall;

6.37 DIO_OutBit

Utilizada para escrever em uma determinada saída através de uma parâmetro inteiro.

Parâmetros :

Nip – Valor inteiro retornado da função Seta_Ip correspondente a um IP para

comunicação.

(28)

Saida – Número da saída que deseja escrever.

Estado – Estado que se deseja escrever na saída :

0

-Desligar

1

-Ligar

Retorno :

-1

- indica que não foi possível escrever na saída.

0

- placa recebeu o comando de alteração da saída.

Sintaxe em C :

int DIO_OutBit( int Nip,int Saida,int Estado);

Sintaxe em Delphi :

function DIO_OutBit(Nip : integer;Saida,Estado: Integer): Integer; stdcall;

6.38 DIO_OutBitStr

Utilizada para escrever em uma determinada saída através de uma parâmetro String.

Parâmetros :

Nip – Valor inteiro retornado da função Seta_Ip correspondente a um IP para

comunicação.

Saida – Número da saída que deseja escrever.

Estado – Estado que se deseja escrever na saída :

N -Desligar

S -Ligar

Retorno :

-1

- indica que não foi possível escrever na saída.

0

- placa recebeu o comando de alteração da saída.

Sintaxe em C :

int DIO_InBitStr( int Nip,int Saida, char * Estado);

Sintaxe em Delphi :

function DIO_OutBitStr(Nip : integer;Saida : Integer; Estado : PChar):

integer; stdcall;

(29)

7 Exemplos de programação

7.1 Delphi

6

Este programa se destina para testes e para desenvolvimento de aplicações para linguagem

de programação Delphi.

Na parte superior da tela, se encontram dados relativos a hardkey PCLink6 . Se esses dados

não estiverem aparecendo, significa que não foi possível ler a hardkey, seja ela remota ou

local.

Atenção :

as placas Firex não necessitam de hardkey

Do lado direito pode ser configurado uma leitura de balança via RS232. Apesar do

programa estar fixando a leitura de COM1 a COM8, a DLL permite a leitura de qualquer

serial que esteja instalada no computador.

Do lado esquerdo pode ser configurado uma leitura de balança via FIREX. Antes de se

fazer esta leitura é necessário que se utilize o programa Firex Tools para configurar a placa

Firex com um endereço IP e parâmetros dos canais A,B,C ou D. Além disso, a Firex deve

ter uma placa SIM no canal que se deseja a leitura e placas PIM (Entradas e Saídas) se for

ativar IO´s.

(30)

7.1.1 Código fonte Delphi6

unit Teste;

interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, AppEvnts, ExtCtrls, OoMisc, AdPort, Buttons, ScktComp; type TThreadLer = class(TThread) private { Private declarations } protected

procedure Execute; override; public Retorno : integer; Tela : integer; procedure ExibeIO; end; TThreadPesar1 = class(TThread) private { Private declarations } protected

procedure Execute; override; public SemMovimento : boolean; smov, sest, gross, tare, net : string; procedure ExibePeso; end; TThreadPesar2 = class(TThread) private { Private declarations } protected

procedure Execute; override; public SemMovimento : boolean; smov, sest, gross, tare, net : string; procedure ExibePeso;

(31)

end; TFormTeste = class(TForm) Panel4: TPanel; Panel1: TPanel; Label11: TLabel; edtIP1: TEdit; Panel2: TPanel; Label2: TLabel; Label5: TLabel; Label1: TLabel; Label6: TLabel; Label3: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label12: TLabel; b1Bal1: TButton; b1Bal2: TButton; Panel3: TPanel; Label4: TLabel; Label10: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Ent10: TPanel; Ent11: TPanel; Ent12: TPanel; Ent13: TPanel; Ent14: TPanel; Ent15: TPanel; Ent16: TPanel; Ent17: TPanel; p1Bit0: TBitBtn; p1Bit7: TBitBtn; p1Bit1: TBitBtn; p1Bit2: TBitBtn; p1Bit3: TBitBtn; p1Bit4: TBitBtn; p1Bit5: TBitBtn; p1Bit6: TBitBtn; Panel6: TPanel; Panel7: TPanel; Panel8: TPanel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; Label22: TLabel; Label23: TLabel; Label24: TLabel; Panel5: TPanel; ckSemMov2: TCheckBox; ckSemMov1: TCheckBox; Label31: TLabel;

(32)

Label32: TLabel; rgSerial: TRadioGroup; b1bal3: TButton; b1bal4: TButton; Label16: TLabel; Label25: TLabel; Label26: TLabel; Label27: TLabel; Label29: TLabel; cbSerial: TComboBox; Label28: TLabel; cbATcp: TComboBox; Label30: TLabel; cbBTcp: TComboBox; Label33: TLabel; cbCTcp: TComboBox; Label34: TLabel; cbDTcp: TComboBox; bInicializa1: TButton; Panel9: TPanel; bInicializa2: TButton; Panel10: TPanel; Label35: TLabel; Label36: TLabel; Label37: TLabel; lblver: TLabel; lblProg: TLabel; Label38: TLabel; lblConex: TLabel; Timer1: TTimer; Label39: TLabel; lblSerial: TLabel;

procedure bInicializa1Click(Sender: TObject); procedure b1Bal1Click(Sender: TObject);

procedure b1Bal2Click(Sender: TObject);

// procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);

procedure ApagarCampos1; procedure ApagarCampos2;

procedure Panelbit(Sender: TObject); procedure FormActivate(Sender: TObject); procedure bInicializa2Click(Sender: TObject); procedure b1bal3Click(Sender: TObject);

procedure b1bal4Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject);

private { Private declarations } public { Public declarations } ThreadLerIo1, ThreadLerIo2 : TThreadLer; ThreadPesar1 : TThreadPesar1; ThreadPesar2 : TThreadPesar2; end;

(33)

var FormTeste : TFormTeste; NumPlacaFirex1, NumPlacaFirex2, CanalSelecionado1, CanalSelecionado2, CanalB1, CanalB2, CanalB3, CanalB4, CanalB5 : integer; ftr : boolean; RecSca, Ips : string; rtt : integer; // SetaIO, // PortaIO : integer; // Time1, // Time2 : TTimeStamp; implementation

function Display_Erro(IP_SETADO : Integer) : PChar; stdcall; external 'PCLINK6.DLL';

function Seta_Ip(IPStr : PChar): Integer; stdcall; external 'PCLINK6.DLL';

function W9091(IP_SETADO : Integer; Canal : PChar): Integer; stdcall; external 'PCLINK6.DLL';

function W9091Serial(Canal : Integer): Integer; stdcall; external 'PCLINK6.DLL';

function WOhaus(IP_SETADO : Integer; Canal : PChar): Integer; stdcall; external 'PCLINK6.DLL';

function WOhausSerial(Canal : Integer): Integer; stdcall; external 'PCLINK6.DLL';

Function Select_Canal(CANAL_SETADO : Integer) : integer; stdcall; external 'PCLINK6.DLL';

Procedure Close_Canal(Canal : integer); stdcall; external 'PCLINK6.DLL';

procedure Deleta_Canal(Canal : integer); stdcall; external 'PCLINK6.DLL';

function Update_Canal(Canal : integer) : Integer; stdcall; external 'PCLINK6.DLL';

function Update_NoMotion(Canal : integer;Tempo : integer) : Integer; stdcall;

external 'PCLINK6.DLL';

function Gross_Canal(Canal : integer) : PChar; stdcall; external 'PCLINK6.DLL';

function Net_Canal(Canal : integer) : PChar; stdcall; external 'PCLINK6.DLL';

function Tare_Canal(Canal : integer) : PChar; stdcall; external 'PCLINK6.DLL';

function DIO_InPort(Nip : integer): Integer; stdcall; external 'PCLINK6.DLL';

function DIO_InPortStr(Nip : integer): PChar; stdcall; external 'PCLINK6.DLL';

(34)

function DIO_InBit(Nip : integer;Entrada : Integer): Integer; stdcall; external 'PCLINK6.DLL';

function DIO_InBitStr(Nip : integer;Entrada : Integer): PChar; stdcall; external 'PCLINK6.DLL';

function DIO_OutPort(Nip : integer;Palavra : Integer): Integer; stdcall; external 'PCLINK6.DLL';

function DIO_OutPortStr(Nip : integer;Palavra : PChar): integer; stdcall; external 'PCLINK6.DLL';

function DIO_OutBit(Nip : integer;Saida,Estado: Integer): Integer; stdcall;

external 'PCLINK6.DLL';

function DIO_OutBitStr(Nip : integer;Saida : Integer; Estado : PChar): integer; stdcall;

external 'PCLINK6.DLL';

function Estado_EmMovimento(Canal : integer) : PChar; stdcall; external 'PCLINK6.DLL';

function Estado_Canal(Canal : integer) : PChar; stdcall; external 'PCLINK6.DLL';

procedure CloseLicense; stdcall; external 'PCLINK6.DLL';

procedure FirVer(var Nome,ver,serial,Conex,Programa : PChar); stdcall; external 'PCLINK6.DLL';

{$R *.dfm}

procedure TFormTeste.bInicializa1Click(Sender: TObject); var i : integer;

begin

// Passa o IP já previamente configurado na Firex if bInicializa1.Tag = 1 then

begin

bInicializa1.Tag := 0; ThreadLerIO1.Terminate; ThreadPesar1.Terminate;

DIO_OutPort(NumPlacaFirex1,0); // desliga todas as saidas for i := 0 to 7 do begin with TBitBtn(FindComponent('p1Bit'+IntToStr(i))) do begin Font.Color := clBlack; end; with TPanel(FindComponent('Ent1'+IntToStr(i))) do begin Color := clGray; end; end; // Application.OnIdle := nil;

bInicializa1.Caption := 'Inicializa comunicação'; b1Bal1.Enabled := False; b1Bal2.Enabled := False; b1Bal3.Enabled := False; b1Bal4.Enabled := False; Panel2.Enabled := False; Panel3.Enabled := False;

(35)

if CanalB1 >= 0 then Close_Canal(CanalB1); if CanalB2 >= 0 then Close_Canal(CanalB2); if CanalB3 >= 0 then Close_Canal(CanalB3); if CanalB4 >= 0 then Close_Canal(CanalB4); ApagarCampos1; end else begin CanalSelecionado1 := -1; ThreadPesar1 := TThreadPesar1.Create(True); ThreadPesar1.FreeOnTerminate := True; ThreadPesar1.Resume; for i := 0 to 7 do begin with TPanel(FindComponent('Ent1'+IntToStr(i))) do begin Color := clRed; end; end; bInicializa1.Tag := 1;

bInicializa1.Caption := 'Finaliza comunicação'; IPs := edtIP1.text; NumPlacaFirex1 := Seta_IP(PChar(IPs)); ThreadLerIO1 := TThreadLer.Create(True); ThreadLerIO1.FreeOnTerminate := True; ThreadLerIO1.Tela := 1; ThreadLerIO1.Resume; case cbATcp.ItemIndex of 0 : CanalB1 := W9091(NumPlacaFirex1,'A'); 1 : CanalB1 := WOhaus(NumPlacaFirex1,'A'); end; if CanalB1 < 0 then begin

ShowMessage('Balança A :'#10#13+'Não foi possível realizar conexão');

end

else b1Bal1.Enabled := True; case cbBTcp.ItemIndex of 0 : CanalB2 := W9091(NumPlacaFirex1,'B'); 1 : CanalB2 := WOhaus(NumPlacaFirex1,'B'); end; if CanalB2 < 0 then begin

(36)

ShowMessage('Balança B :'#10#13+'Não foi possível realizar conexão');

end

else b1Bal2.Enabled := True; case cbCTcp.ItemIndex of 0 : CanalB3 := W9091(NumPlacaFirex1,'C'); 1 : CanalB3 := WOhaus(NumPlacaFirex1,'C'); end; if CanalB3 < 0 then begin

ShowMessage('Balança C :'#10#13+'Não foi possível realizar conexão');

end

else b1Bal3.Enabled := True; case cbDTcp.ItemIndex of 0 : CanalB4 := W9091(NumPlacaFirex1,'D'); 1 : CanalB4 := WOhaus(NumPlacaFirex1,'D'); end; if CanalB4 < 0 then begin

ShowMessage('Balança D :'#10#13+'Não foi possível realizar conexão');

end

else b1Bal4.Enabled := True; Panel2.Enabled := True; Panel3.Enabled := True; FormTeste.SelectNext(bInicializa1,True,True); end; end; procedure TFormTeste.ApagarCampos1; begin // Application.OnIdle := nil; Label5.Caption := ''; Label6.Caption := ''; Label7.Caption := ''; Label9.Caption := ''; Label25.Caption := ''; end; procedure TFormTeste.ApagarCampos2; begin // Application.OnIdle := nil; Label18.Caption := ''; Label20.Caption := ''; Label22.Caption := ''; Label24.Caption := ''; Label27.Caption := ''; end;

procedure TFormTeste.Panelbit(Sender: TObject); begin

(37)

// PortaIO := StrToInt((Sender as TBitBtn).caption);

if MessageDlg('Cuidado !'+#13#13+'Certifique-se que pode ser alterado '+

'o estado atual deste port de saída.',mtWarning,mbOKCancel,0) = mrOK then begin

if (Sender as TBitBtn).Font.Color = clRed then begin

// Esta ligado

(Sender as TBitBtn).Font.Color := clBlack;

DIO_OutBit(NumPlacaFirex1,StrToInt((Sender as TBitBtn).caption),0); // SetaIO := 0; end else begin // Esta desligado

(Sender as TBitBtn).Font.Color := clRed;

DIO_OutBit(NumPlacaFirex1,StrToInt((Sender as TBitBtn).caption),1); // SetaIO := 1;

end; end; end;

procedure TFormTeste.b1Bal1Click(Sender: TObject); begin ApagarCampos1; CanalSelecionado1 := CanalB1; b1Bal1.Enabled := False; b1Bal2.Enabled := True; b1Bal3.Enabled := True; b1Bal4.Enabled := True; FormTeste.ActiveControl := b1Bal2; end;

procedure TFormTeste.b1Bal2Click(Sender: TObject); begin ApagarCampos1; CanalSelecionado1 := CanalB2; b1Bal1.Enabled := True; b1Bal2.Enabled := False; b1Bal3.Enabled := True; b1Bal4.Enabled := True; FormTeste.ActiveControl := b1Bal1; end;

procedure TFormTeste.b1bal3Click(Sender: TObject); begin

ApagarCampos1;

CanalSelecionado1 := CanalB3; b1Bal1.Enabled := True;

(38)

b1Bal3.Enabled := False; b1Bal4.Enabled := True;

FormTeste.ActiveControl := b1Bal4; end;

procedure TFormTeste.b1bal4Click(Sender: TObject); begin ApagarCampos1; CanalSelecionado1 := CanalB4; b1Bal1.Enabled := True; b1Bal2.Enabled := True; b1Bal3.Enabled := True; b1Bal4.Enabled := False; FormTeste.ActiveControl := b1Bal1; end;

procedure TFormTeste.FormActivate(Sender: TObject); begin

FormTeste.ActiveControl := edtIP1; end;

procedure TThreadLer.Execute; begin

While not Terminated do begin

retorno := DIO_InPort(NumPlacaFirex1); if retorno <> -1 then Synchronize(Exibeio); sleep(500);

end; end;

procedure TThreadLer.ExibeIO; var i,j : integer;

begin j := 1; for i := 0 to 7 do begin with TPanel(FormTeste.FindComponent('Ent'+IntToStr(Tela)+IntToStr(i))) do begin

if (retorno and j) > 0 then Color := clTeal else Color := clRed; j := j shl 1; end; end; end; procedure TThreadPesar1.Execute; var ret : integer;

begin

while not terminated do begin

(39)

if CanalSelecionado1 >= 0 then begin if Select_Canal(CanalSelecionado1) = 0 then begin gross := 'Erro'; tare := ''; net := ''; smov := ''; sest := ''; Synchronize(ExibePeso); end else begin // Execute do IP1 if SemMovimento then begin ret := Update_NoMotion(CanalSelecionado1,5000); end else begin ret := Update_Canal(CanalSelecionado1); end;

if (ret = 0) or (ret = 3) then begin if ret = 0 then begin gross := StrPas(Gross_canal(CanalSelecionado1)); tare := StrPas(Tare_canal(CanalSelecionado1)); net := StrPas(Net_canal(CanalSelecionado1)); smov := StrPas(Estado_EmMovimento(CanalSelecionado1)); end; if ret = 3 then begin gross := 'Sobrecarga'; tare := ''; net := ''; smov := ''; end; sest := StrPas(Estado_Canal(CanalSelecionado1)); end;

// Aqui deve ser analisado caso a caso...se timeout, se sobrecarga

if (ret <> 0) and (ret <> 3) then begin

gross := 'Erro'; tare := ''; net := ''; smov := '';

(40)

end; Synchronize(ExibePeso); end; end; sleep(1); // Application.ProcessMessages; end; gross := ''; tare := ''; net := ''; smov := ''; sest := ''; Synchronize(ExibePeso); end; procedure TThreadPesar1.ExibePeso; begin

// Exibe peso do IP1

FormTeste.Label5.Caption := Gross; FormTeste.Label6.Caption := Tare; FormTeste.Label7.Caption := Net; FormTeste.Label9.Caption := smov; FormTeste.Label25.Caption := sest; SemMovimento := FormTeste.ckSemMov1.Checked; end; procedure TThreadPesar2.Execute; var ret : integer;

begin

while not terminated do begin if CanalSelecionado2 >= 0 then begin if Select_Canal(CanalSelecionado2) = 0 then begin gross := 'Erro'; tare := ''; net := ''; smov := ''; sest := ''; Synchronize(ExibePeso); end else begin // Execute do IP1 if SemMovimento then begin

(41)

ret := Update_NoMotion(CanalSelecionado2,5000); end else begin ret := Update_Canal(CanalSelecionado2); end;

if (ret = 0) or (ret = 3) then begin if ret = 0 then begin gross := StrPas(Gross_canal(CanalSelecionado2)); tare := StrPas(Tare_canal(CanalSelecionado2)); net := StrPas(Net_canal(CanalSelecionado2)); smov := StrPas(Estado_EmMovimento(CanalSelecionado2)); end; if ret = 3 then begin gross := 'Sobrecarga'; tare := ''; net := ''; smov := ''; end; sest := StrPas(Estado_Canal(CanalSelecionado2)); end;

// Aqui deve ser analisado caso a caso...se timeout, se sobrecarga

if (ret <> 0) and (ret <> 3) then begin gross := 'Erro'; tare := ''; net := ''; smov := ''; end; Synchronize(ExibePeso); end; end; sleep(1); // Application.ProcessMessages; end; gross := ''; tare := ''; net := ''; smov := ''; sest := '';

(42)

Synchronize(ExibePeso); end;

procedure TThreadPesar2.ExibePeso; begin

// Exibe peso do IP1

FormTeste.Label18.Caption := Gross; FormTeste.Label20.Caption := Tare; FormTeste.Label22.Caption := Net; FormTeste.Label24.Caption := smov; FormTeste.Label27.Caption := sest; SemMovimento := FormTeste.ckSemMov2.Checked; end;

procedure TFormTeste.bInicializa2Click(Sender: TObject); begin

// Passa o IP já previamente configurado na Firex if bInicializa2.Tag = 1 then

begin

bInicializa2.Tag := 0; ThreadPesar2.Terminate; Sleep(1000);

bInicializa2.Caption := 'Iniciar leitura'; ApagarCampos2; Panel8.Enabled := False; if CanalB5 >= 0 then begin Close_Canal(CanalB5); Deleta_Canal(CanalB5); end; end else begin CanalSelecionado2 := -1; ThreadPesar2 := TThreadPesar2.Create(True); ThreadPesar2.FreeOnTerminate := True; ThreadPesar2.Resume; bInicializa2.Tag := 1;

bInicializa2.Caption := 'Finalizar pesagem';

case cbSerial.ItemIndex of

0 : CanalB5 := W9091Serial(rgSerial.ItemIndex+1); 1 : CanalB5 := WOhausSerial(rgSerial.ItemIndex+1); end;

(43)

begin

ShowMessage('Balança via porta serial :'#10#13+'Não foi possível realizar leitura.'); exit; end; CanalSelecionado2 := CanalB5; Panel8.Enabled := True; FormTeste.SelectNext(bInicializa2,True,True); end; end;

procedure TFormTeste.FormClose(Sender: TObject; var Action: TCloseAction);

begin

CloseLicense; end;

procedure TFormTeste.Timer1Timer(Sender: TObject); var Nome,ver,serial,Conex,Programa : PChar;

begin

FirVer(Nome,ver,serial,Conex,Programa);

lblver.Caption := StrPas(nome) + ' ' + StrPas(ver); lblProg.caption := strpas(Programa);

lblConex.caption := strpas(Conex); lblSerial.Caption := serial;

end; end.

(44)

7.2 Exemplo VB 6

Este programa se destina para testes e para desenvolvimento de aplicações para linguagem

de programação Visual Basic.

Na parte superior da tela, se encontram dados relativos a hardkey PCLink6 . Se esses dados

não estiverem aparecendo, significa que não foi possível ler a hardkey, seja ela remota ou

local.

Do lado direito pode ser configurado uma leitura de balança via RS232. Apesar do

programa estar fixando a leitura de COM1 a COM8, a DLL permite a leitura de qualquer

serial que esteja instalada no computador.

Do lado esquerdo pode ser configurado uma leitura de balança via FIREX. Antes de se

fazer esta leitura é necessário que se utilize o programa Firex Tools para configurar a placa

Firex com um endereço IP e parâmetros dos canais A,B,C ou D. Além disso, a Firex deve

ter uma placa SIM no canal que se deseja a leitura e placas PIM (Entradas e Saídas) se for

ativar IO´s.

7.2.1 Código fonte VB 6

Attribute VB_Name = "Geral"

'Desenvolvido para Visual Basic 6.0 Service Pack 5 Option Explicit

Public tentativa, i, Codigo, Tipo As Long 'Variaveis utilizadas para serial

(45)

Public CanalSerial As Long

Public s_mov, s_est, s_gross, s_tare, s_net, s_sest As String 'Variaveis utilizadas para TcpIp

Public i_SemMovimento As Boolean Public NumPlacaFirex As Long Public CanalTcp, retIO As Long

Public i_mov, i_est, i_gross, i_tare, i_net, i_sest, IPs As String

'Declara algumas funções da dll utilizadas nesse programa Declare Function Display_Erro Lib "PcLink6.dll" _

(ByVal IP_SETADO As Long) As String

Declare Function Seta_Ip Lib "PcLink6.dll" _ (ByVal IPStr As String) As Long

Declare Function W9091 Lib "PcLink6.dll" _

(ByVal IP_SETADO As Long, ByVal Canal As String) As Long Declare Function W9091Serial Lib "PcLink6.dll" _

(ByVal Canal As Long) As Long

Declare Function WOhaus Lib "PcLink6.dll" _

(ByVal IP_SETADO As Long, ByVal Canal As String) As Long Declare Function WOhausSerial Lib "PcLink6.dll" _

(ByVal Canal As Long) As Long

Declare Function Select_Canal Lib "PcLink6.dll" _ (ByVal CANAL_SETADO As Long) As Long

Declare Sub Close_Canal Lib "PcLink6.dll" (ByVal Canal As Long) Declare Sub Deleta_Canal Lib "PcLink6.dll" (ByVal Canal As Long) Declare Function Update_Canal Lib "PcLink6.dll" _

(ByVal Canal As Long) As Long

Declare Function Update_NoMotion Lib "PcLink6.dll" _ (ByVal Canal As Long, ByVal Tempo As Long) As Long Declare Function Gross_Canal Lib "PcLink6.dll" _ (ByVal Canal As Long) As String

Declare Function Net_Canal Lib "PcLink6.dll" _ (ByVal Canal As Long) As String

Declare Function Tare_Canal Lib "PcLink6.dll" _ (ByVal Canal As Long) As String

(46)

Declare Function DIO_InPort Lib "PcLink6.dll" _ (ByVal Nip As Long) As Long

Declare Function DIO_InPortStr Lib "PcLink6.dll" _ (ByVal Nip As Long) As String

Declare Function DIO_InBit Lib "PcLink6.dll" _ (ByVal Nip As Long, ByVal Entrada As Long) As Long Declare Function DIO_InBitStr Lib "PcLink6.dll" _ (ByVal Nip As Long, Entrada As Long) As String Declare Function DIO_OutPort Lib "PcLink6.dll" _ (ByVal Nip As Long, ByVal Palavra As Long) As Long Declare Function DIO_OutPortStr Lib "PcLink6.dll" _ (ByVal Nip As Long, Palavra As String) As Long Declare Function DIO_OutBit Lib "PcLink6.dll" _

(ByVal Nip As Long, ByVal Saida As Long, ByVal Estado As Long) As Long Declare Function DIO_OutBitStr Lib "PcLink6.dll" _

(ByVal Nip As Long, ByVal Saida As Long, ByVal Estado As String) As Long Declare Function Estado_EmMovimento Lib "PcLink6.dll" _

(ByVal Canal As Long) As String

Declare Function Estado_Canal Lib "PcLink6.dll" _ (ByVal Canal As Long) As String

Declare Sub CloseLicense Lib "PcLink6.dll" () Declare Sub FirVer Lib "PcLink6.dll" _

(ByRef Nome As String, _ ByRef ver As String, _ ByRef serial As String, _ ByRef conex As String, _ ByRef Programa As String)

VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END

Attribute VB_Name = "PckIo"

Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True

Attribute VB_PredeclaredId = False Attribute VB_Exposed = False

(47)

' Aqui é utilizado as funcoes OutPort e Inport, para todas as entradas e saídas.

' Poderia ser utilizado inbit ou outbit para escrever individualmente, ' mas precisa ser analisado cada caso individualmente

Option Explicit

Public ResEnt As Integer Public ResSai As Integer

Private Entrada(1 To 8) As Long Private Saida(1 To 8) As Long

Public Sub SetSaida(sa As Integer, va As Integer) Saida(sa) = va

End Sub

Public Function GetEntrada(va As Integer) As Integer GetEntrada = Entrada(va)

End Function

Public Function Refresh(NFir As Long) As Boolean Dim i, j, ats, ret As Integer

Refresh = False

'Lê todas as entradas, direto da Firex ResEnt = DIO_InPort(NFir)

If ResEnt <> -1 Then j = 1

For i = 1 To 8

'verifica bit a bit o estado da entrada If (ResEnt And j) > 0 Then

Entrada(i) = 1 Else Entrada(i) = 0 End If j = j * 2 Next Else Exit Function End If ats = 0 j = 1 For i = 1 To 8

'Prepara o estado das saídas bit a bit If Saida(i) = 1 Then

ats = ats Or j End If

j = j * 2 Next

ret = DIO_OutPort(NFir, ats) ' ativa as saidas If ret = -1 Then

Exit Function End If

Referências

Documentos relacionados

v staršom Slovníku slovenského jazyka (zv. 4, 1964), ktoré však nesúvisí s podstatným menom stávka v uvedenom význame, ale s podstatným me- nom stávka s

Daí os fundamentos das dúvidas que são postas na presente pesquisa, análise interdisciplinar cujos aportes caminham pela filosofia em geral, a filosofia

André Valdetaro Gomes Cavalieri (Coordenador do PG-EAM), o Prof.. Cláudia Regina de Andrade (Representante

pseudotuberculosis a agentes antimicrobianos mediante o teste Disco- difusão, isolados de caprinos e ovinos abatidos no Matadouro Público de Patos- PB no período de março a

Apresenta os principais fatos do dia do setor agropecuário, as notícias atualizadas, a previsão do tempo, boletins ao vivo dos principais eventos e leilões que acontecem

Julho de 2015 e organizada pela Associação Caboverdeana de Lisboa em conjunto com o Instituto de História Contemporânea da Universidade Nova de Lisboa e a Embaixada de Cabo Verde

Serviços:  agrega  os  valores  liquidados  por  conta  de  serviços  prestados,  a  ou  por,  unidades  institucionais  residentes  em  Cabo  Verde, 

[r]