2011년 8월 23일 화요일

CublocStudio 인터럽트 입력확장

CublocStudio에서 인터럽트 입력 주의
2011-8-24 chaejoo@lifentech. c o m

CublocStudio에서 사용하는 Ladder Interrupt에서 다음과 같은 경우.

Const Device = CB280
Usepin 11,In
Usepin 12,In
Usepin 13,In
Dim A As Byte
'//8 비트,NONE 패리티,1 스톱비트로 설정 //수신버퍼는 30~100 이하, 송신버퍼는 30~50 이하로
Opencom 1, 19200, 3, 30, 20
Set Ladder On
On Ladderint Gosub OCCURINT
On Recv1 Gosub RECV_1
Do
Loop
OCCURINT:
 Putstr 1,Dec _D(0),Cr
Return
RECV_1:
 A = Get(1,1)
 Put 1,A,1
Return

바로 LADDER 인터럽트를 이용하는 것입니다. 레더는 10mS 마다 루프를 돌기 때문에 어떤 입력 핀의 변화를 감지할 수 있습니다. P11과 P12, P13의 입력 핀이 LOW 에서 HIGH 로 바뀌었을 때 ON LADDERINT 가 발생되도록 하는 것입니다.  

이 방법을 사용할 때 유의할 점은 LADDER LOGIC 의 스캔타임이 10mS 라는 점입니다. 즉, 10mS 보다 짧은 펄 스가 발생되는 신호라면 이 방법을 사용할 수 없습니다. 적어도 30mS 이상 되는 신호에 사용하는 것이 좋습니다.
또한 이 방법으로, 동시에 여러 개의 입력신호를 받아들이지 못합니다. 만약 동시에 입력이 들어온다면, 레더로직 상의 가장 아래쪽에 위치한 신호만 검출됩니다. 위의 경우 P13에 뭔가가 걸려서 계속 HIGH상태가 유지되는 상태에서 P11, P12에  LOW 에서 HIGH 가 되었다고 하더라도 P13 인터럽트 처리가 만료되지 않을 것으로 간주 됩니다. 이런 점을 감안하고 사용하시기 바랍니다.

그래서:  다음과 같이 바꾸었습니다.

Const Device = CB280
Usepin 11,In
Usepin 12,In
Usepin 13,In
Usepin 41,Out
Usepin 42,Out
Dim A As Byte
Dim A1 As Byte
Dim A2 As Byte
Dim A3 As Byte
'//8 비트,NONE 패리티,1 스톱비트로 설정 //수신버퍼는 30~100 이하, 송신버퍼는 30~50 이하로
Opencom 1, 19200, 3, 30, 20
On Recv1 Gosub RECV_1
Do
 Out 41,In(11)
 Out 42,In(12)
 If In(11)=0 Then A1=0
   If In(11)=1  And A1=0 Then
    A1 = 1
      Putstr 1,Dec A1,Cr
 Endif
 If In(12)=0 Then A2 = 0
   If In(12)=1  And A2 = 0 Then
  A2 = 2
      Putstr 1,Dec A2,Cr
 Endif
 If In(13)=0 Then A3 = 0
   If In(13)=1 And A3 = 0 Then
  A3 = 3
      Putstr 1,Dec A3,Cr
 Endif
Loop
OCCURINT:
 Putstr 1,Dec _D(0),Cr
Return
RECV_1:
 A = Get(1,1)
 Put 1,A,1
Return

댓글 없음: