Borland Delphi2.0/3.0 com suas funções poderosas e programação conveniente e rápida
E amado pela maioria dos programadores. Mas ao usá-lo para escrever programas de controle industrial, você precisa
O dispositivo externo conectado ao computador opera, ou seja, lê e grava diretamente o endereço de E/S.
Neste momento, o software parece ter algumas falhas.
Em resposta a este problema, o autor usa Delphi 2.0/3.0 para escrever na forma de assembly embutido
Está instalado um módulo PORT95.PAS, que pode facilmente realizar operações diretas de leitura e escrita em endereços de E/S.
O código é simples e rápido de executar.
Ao usá-lo, basta adicionar PORT95.PAS ao arquivo do projeto e adicionar Port aos usuários
95, você pode operar diretamente a porta de E/S na aplicação.
O método de implementação específico e o código-fonte do PORT95.PAS são os seguintes:
unidade Porta95;
interface
função PortReadByte(Endereço:Word): Byte;
função PortReadWord(Addr:Word): Palavra;
função PortReadWordLS(Addr:Word): Palavra;
Procedimento PortWriteByte(Endereço:Word; Valor:Byte);
procedimento PortWriteWord(Endereço:Palavra; Valor:Palavra);
procedimento PortWriteWordLS(Endereço:Palavra; Valor:Palavra);
implementação
{*
* Função de leitura de byte de porta
*Parâmetro: endereço da porta
*Retorno: valor do byte de determinada porta
*}
função PortReadByte(Addr:Word): Byte montador;
éster;
asm
MOVDX,AX
EM AL,DX
fim;
{*
* Função de leitura de porta de alta velocidade
* Parâmetro: endereço da porta
* Retorno: valor da palavra de determinada porta
*Comentário:pode haver problemas com alguns cartões e computadores que
não consigo acessar a palavra inteira, geralmente funciona.
*}
função PortReadWord(Addr:Word): Word montador;
éster;
asm
MOVDX,AX
EM AX,DX
fim;
{*
* Função de leitura de porta de baixa velocidade
* Parâmetro: endereço da porta
*Return: valor da palavra de determinada porta
*Comentário: trabalhe em casos, apenas para ajustar DELAY se necessário
*}
função PortReadWordLS(Addr:Word): Word re;
registro;
const
Atraso = 150;
// dependendo da velocidade da CPU e da velocidade dos cartões
asm
MOVDX,AX
EM AL,DX
//lê a porta LSB
MOV ECX, atraso
@1:
LOOP @1 //atraso entre duas leituras
XCHG AH,AL
INC DX
//porta+1
IN AL,DX //lê a porta MSB
XCHG AH,AL //restaura a ordem dos bytes
fim;
{* Função de byte de gravação de porta*}
procedimento PortWriteByte(Endereço:Word; Valor:Byte montar);
registre-se;
asm
XCHGAX,DX
FORA DX,AL
fim;
{*
* Procedimento de palavra de gravação de porta de alta velocidade
*Comentário:pode haver problemas com alguns cartões e computadores que
não consigo acessar a palavra inteira, geralmente funciona.
*}
procedimento PortWriteWord(Endereço:palavra; Valor:palavra montar);
registre-se;
asm
XCHGAX,DX
OUTDX,AX
fim;
{*
* Procedimento de gravação de palavra de porta de baixa velocidade
*}
procedimento PortWriteWordLS(Endereço:palavra; Valor:palavra montagem);
ler registro;
const
Atraso = 150;
// dependendo da velocidade da CPU e da velocidade dos cartões
asm
XCHGAX,DX
FORA DX,AL
MOV ECX, atraso
@1:
LOOP@1
XCHG AH,AL
INC DX
FORA DX,AL
fim;
fim. //Fim da unidade
O PORT95.PAS acima é adequado para os sistemas operacionais Delphi 2.0/3.0 e Windows 95
.