사용자 도구

사이트 도구

English

cublocapp:an32011:index

AN32011 - MODPORT를 이용한 A/D변환

큐블록에는 10비트의 A/D변환기가 들어있습니다. 이것보다도 더 높은 해상도의 A/D변환기가 필요하신 분은 별도로 A/D칩을 붙여서 해결해야 합니다. (http://cubloc.blog.me/220477285916)

그런데, A/D칩을 바로 센서에 붙이면, 온갖 노이즈와 함께 들어오므로 측정결과가 매우 흔들리고 맙니다. 부가적인 노이즈 제거 회로를 앞에 붙여주어야 만족할 만할 값을 읽어올 수 있습니다.

초보자 입장에서는 만만한 일이 아닙니다. 그래서 저는 A/D칩보다는 A/D모듈을 추가해서 RS232 (또는 RS485)로 읽어오는것을 추천해드리고 있습니다. (http://cubloc.blog.me/220061594085)

저희 회사 제품중에 “모드포트”라는 제품이 있습니다. RS485 모드버스 프로토콜로 연결해서 다양한 I/O를 연결할 수 있는 제품입니다. 이중 고해상도 A/D변환기가 있습니다. 13.3비트 짜리 A/D변환기 입니다.

이 것을 큐블록 MSB와 연결해 보았습니다.

큐블록 MSB610L-DC를 사용했습니다.이 제품은 RS232C 채널1만 있으므로, RS232-TO-RS485 변환기가 필요합니다. CN-RS232485변환기를 사용해서 MODPORT와 연결했습니다.

소스 프로그램

다음과 같이 프로그래밍을 했습니다. 모드버스 프로토콜로 데이터를 읽어오는 프로그램입니다.

an32011.zip

#include "MSB6XX"
#define ComChannel 1
Dim _CMTxb(20) As Byte
Dim _CMrxdata(32) As Byte
Dim _Crcvalue As Integer
 
Opencom ComChannel,57600,3,50,50
Dim tempA As Long
Do
 tempA = EPhadin(1,1)
 Debug Dec tempA,Cr
 Wait 1000
Loop
 
End
 
Function EPhadin(CMPid As Byte, CMPno As Byte) As Long
 Dim tempva As Long
 Bclr ComChannel,0 
 CMBreadReg CMPid,CMPno+199,2
 Delay 3
 If Blen(ComChannel,0) > 6 Then
  Geta ComChannel,_CMrxdata,7
  tempva = _CMrxdata(3)
  tempva = tempva * 256 + _CMrxdata(4)
  tempva = tempva * 256 + _CMrxdata(5)
  tempva = tempva * 256 + _CMrxdata(6)
  EPhadin = tempva
 Else
  EPhadin = 199999 '모듈못찾으면 199999   1~5v모드시 1v이하는 -111111, 5v이상은 +222222
 Endif            '음수는 2의 보수가 아니고, MSB만 1로 됨.
 Bclr ComChannel,0  
End Function
 
' 여기서부터 모드버스 RTU용 라이브러리입니다.
 
Sub CMBreadReg(_MBslave As Byte,_MBadr As Integer,_MBlen As Integer)
 _CMTxb(0) = _MBslave
 _CMTxb(1) = 3
 _CMTxb(2) = _MBadr.Byte1
 _CMTxb(3) = _MBadr.Byte0
 _CMTxb(4) = _MBlen.Byte1
 _CMTxb(5) = _MBlen.Byte0
 Getcrc _Crcvalue,_CMTxb,6
 _CMTxb(6) = _Crcvalue.Byte1
 _CMTxb(7) = _Crcvalue.Byte0
 Puta ComChannel,_CMTxb,8
End Sub

실행결과

결과가 디버그창에 이렇게 표시됩니다. 노이즈제거 회로가 들어가 있어서, 안정적으로 값이 읽혀집니다.

큐블록 어플리케이션 노트

cublocapp/an32011/index.txt · 마지막으로 수정됨: 2017/10/18 12:54 저자 Comfile Technology