PCLink for Windows - Versão 6.0
Serial e Ethernet
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
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 :
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
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.
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.
! 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.
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.
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
INTxD
2 Tx
OUTRTS
3 Rx
INRxD
4 Rx
OUTCTS
5 — Gnd
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.
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.
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
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 :
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.
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 dataCaracter de início, usado por @S Fim de StLin
Caracter de fim, usado por @E Fim de EndLin
User-defined string
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 handshakeSintaxe 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 :
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.
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 :
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 :
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
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.
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 :
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 :
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.
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;
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.
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;
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;
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;
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';
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;
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
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
// 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;
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
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 := '';
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
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 := '';
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;
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.
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
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
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
' 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