강력한 기능과 편리하고 빠른 프로그래밍을 갖춘 Borland Delphi2.0/3.0
그리고 대다수의 프로그래머들에게 사랑을 받았습니다. 그러나 산업용 제어 프로그램을 작성하는 데 이를 사용할 때는 다음을 수행해야 합니다.
컴퓨터에 연결된 외부 장치가 동작합니다. 즉, I/O 주소를 직접 읽고 씁니다.
현재 소프트웨어에 몇 가지 결함이 있는 것 같습니다.
이 문제에 대해 저자는 Delphi 2.0/3.0을 사용하여 인라인 어셈블리 형식으로 작성합니다.
I/O 주소에 대한 직접 읽기 및 쓰기 작업을 쉽게 실현할 수 있는 모듈 PORT95.PAS가 설치되었습니다.
코드는 간단하고 실행 속도가 빠릅니다.
사용시에는 프로젝트 파일에 PORT95.PAS를 추가하고 사용자에게 포트만 추가하면 됩니다.
95에서는 애플리케이션에서 I/O 포트를 직접 조작할 수 있습니다.
PORT95.PAS의 구체적인 구현 방법과 소스 코드는 다음과 같습니다.
유닛 Port95;
인터페이스
함수 PortReadByte(Addr:Word) : 바이트;
함수 PortReadWord(Addr:Word) : 단어;
함수 PortReadWordLS(Addr:Word) : 단어;
PRocedure PortWriteByte(주소:워드; 값:바이트);
절차 PortWriteWord(주소:Word; 값:Word);
절차 PortWriteWordLS(Addr:Word; 값:Word);
구현
{*
* 포트 읽기 바이트 기능
*매개변수:포트 주소
*반환: 해당 포트의 바이트 값
*}
function PortReadByte(Addr:Word) : 바이트 등록;
스터;
asm
MOVDX,AX
AL, DX에서
끝;
{*
* HIGH SPEED 포트 워드 읽기 기능
* 매개변수: 포트 주소
* 반환: 해당 포트의 단어 값
* 코멘트: 일부 카드와 컴퓨터에서는 문제가 발생할 수 있습니다.
전체 단어에 접근할 수 없습니다. 일반적으로 작동합니다.
*}
function PortReadWord(Addr:Word) : 워드 어셈블러;
스터;
asm
MOVDX,AX
인AX,DX
끝;
{*
* LOW SPEED 포트 워드 읽기 기능
* 매개변수: 포트 주소
*반환: 해당 포트의 단어 값
*설명: 경우에 따라 작업하고 필요한 경우에만 DELAY를 조정하세요.
*}
function PortReadWordLS(Addr:Word) : 워드 어셈블러;
거스터;
const
지연 = 150;
// CPU 속도와 카드 속도에 따라 다름
asm
MOVDX,AX
AL, DX에서
//LSB 포트 읽기
MOV ECX,지연
@1:
LOOP @1 //두 읽기 사이의 지연
XCHG 아, 알
INC DX
//포트+1
IN AL,DX //MSB 포트 읽기
XCHG AH,AL //바이트 순서 복원
끝;
{* 포트 쓰기 바이트 기능*}
절차 PortWriteByte(Addr:Word; 값:Byte);
r; 등록하다;
asm
XCHGAX, DX
아웃 DX,AL
끝;
{*
* HIGH SPEED 포트 쓰기 워드 절차
* 코멘트: 일부 카드와 컴퓨터에서는 문제가 발생할 수 있습니다.
전체 단어에 접근할 수 없습니다. 일반적으로 작동합니다.
*}
절차 PortWriteWord(주소:단어; 값:단어);
r; 등록하다;
asm
XCHGAX, DX
아웃디엑스,AX
끝;
{*
* LOW SPEED 포트 쓰기 워드 절차
*}
절차 PortWriteWordLS(주소:단어; 값:단어);
등록;
const
지연 = 150;
// CPU 속도와 카드 속도에 따라 다름
asm
XCHGAX, DX
아웃 DX,AL
MOV ECX,지연
@1:
루프@1
XCHG 아, 알
INC DX
아웃 DX,AL
끝;
end. //유닛 끝
위의 PORT95.PAS는 Delphi 2.0/3.0 및 Windows 95 운영 체제에 적합합니다.
.