[프로젝트예제]엠케이 프리시젼社의 MPR-Z300 통신예제 입니다. (소스포함)
본문
* 프로젝트 소스 첨부파일 있습니다. 다운받으시고 스튜디오에서 프로젝트 불러오기 하면 됩니다.
질량 유량계 전문기업인 엠케이프리시젼(주)의 MFC 컨트롤러 제품
MPR-Z300 의 시리얼 통신방법 예제입니다. 참고하시고 활용하시면 좋겠습니다.
* 통신방식 : RS-485
* eRun에서 제공되는 USERNET을 이용해서 통신방법을 설명합니다.
1) 우선 아래 그림은 I/O 디바이스 설정화면입니다.
* 다음은 송수신 패킷 정보에 대한 내용입니다.
* Read Flow Packet 내용
To Device -> |STR|:01030038<0d> :-> CH1, RF(03), 00, 38(XOR)
Fr Device -> |STA|<3A>|DX4|8|8|END|<0d>|
:-> START 문자 <3A>, 부동소수형 값(|DX4|8|8| -> 패킷의 8번째부터 8바이트 읽어서 16진형으로 계산값), 끝문자(0x13)
* Write Flow Packet 내용
To Device ->|LNK|%s|STR|<0d>
:-> UI에서 넘어오는 문자열 패킷(|LNK|%s|), 끝문자(0x13)
From Device ->|STA|<3A>|END|<0d>|
:-> Write Flow 패킷의 회신 데이터는 별도로 없어서 이와 같이 설정한다. START 문자 <3A>, 끝문자(0x13)
* Write Float On/OFF Packet
앞에서 설명한 Write Flow Packet과 패킷구성은 동일하다.
2) PV값 태그와 연결하는 방법
태그 PV1(CH1 FLOW값)의 디바이스와 어드레스 설정하는 방법입니다. 태그 데이터형은 아날로그 FLOT(4바이트)로 설정합니다.
3) FLOW값 내보내기
채널별 SET FLOW 값을 내보내려면 UI 화면에서 내보내기 버튼을 눌렀을 경우에 처리합니다.
본 엠케이프리시젼社의 MPR-Z230 전용 드라이버가 없기에 사용자정의 프로토콜 드라이버(USERNET.DLL)을 사용해야 합니다.
그래서 읽기는 간단히 설정만으로 가능하지만, FLOW값 또는 ON/OFF를 내보내려면 스크립트 작성이 필요합니다.
아래의 내용은 FLOW값 내보내기, FLOW ON/OFF 할 경우에 각 함수를 호출해합니다.
SET FLOW 또는 SET FLOW ON.OFF는 패킷 문자열을 만들어서 USERNET을 통해서 송출해주면 됩니다.
// FLOW값을 내보내려면 아래 함수를 채널번호를 포함해서 호출합니다.
void MPR_SET_FLOW(int nCH)
{
string str, strHead, strData;
int len, cnt, chk;
int cByte;
float fValue;
if(nCH==1) fValue = @MPR.SV1_V;
else if(nCH==2) fValue = @MPR.SV2_V;
else if(nCH==3) fValue = @MPR.SV3_V;
else if(nCH==4) fValue = @MPR.SV4_V;
strHead = _FormatString(":010107%s", _NumToStr(fValue, 16));
_TraceEx("MPR_SET_FLOW(%d, %f) string=%s", nCH, fValue, strHead);
len = _StrLen(strHead);
cnt = 0;
chk = 0;
// XOR 연산.
while(cnt < len) {
cByte = _AsciiCode(strHead, cnt); //_StrMid(strHead, cnt, 1));
_TraceEx("cByte(%d) %x", cnt, cByte);
chk = chk ^ cByte;
cnt++;
}
strData = _FormatString("%s%02X", strHead, chk);
_TraceEx("MPR_SET_FLOW(%d, %f) string=%s", nCH, fValue, strData);
// 디바이스에 출력.
if(nCH==1) @MPR.SV1 = strData;
else if(nCH==2) @MPR.SV2 = strData;
else if(nCH==3) @MPR.SV3 = strData;
else if(nCH==4) @MPR.SV4 = strData;
}
// SET FLOW ON/OFF
// FLOW ON/OFF 명령을 주려면 아래 함수를 채널번호를 포함해서 호출합니다.
void MPR_SET_FLOW_ONOFF(int nCH)
{
string str, strHead, strData;
int len, cnt, chk;
int cByte;
int nStat;
if(nCH==1) nStat = @MPR.ONOFF1_V;
else if(nCH==2) nStat = @MPR.ONOFF2_V;
else if(nCH==3) nStat = @MPR.ONOFF3_V;
else if(nCH==4) nStat = @MPR.ONOFF4_V;
strHead = _FormatString(":015802%02d", nStat);
_TraceEx("MPR_SET_FLOW_ONOFF(%d, %d) string=%s", nCH, nStat, strHead);
len = _StrLen(strHead);
cnt = 0;
chk = 0;
// XOR 연산.
while(cnt < len) {
cByte = _AsciiCode(strHead, cnt); //_StrMid(strHead, cnt, 1));
_TraceEx("cByte(%d) %x", cnt, cByte);
chk = chk ^ cByte;
cnt++;
}
strData = _FormatString("%s%02X", strHead, chk);
_TraceEx("MPR_SET_FLOW_ONOFF(%d, %d) string=%s", nCH, nStat, strData);
// 디바이스에 출력.
if(nCH==1) @MPR.ONOFF1 = strData;
else if(nCH==2) @MPR.ONOFF2 = strData;
else if(nCH==3) @MPR.ONOFF3 = strData;
else if(nCH==4) @MPR.ONOFF4 = strData;
}
댓글목록 0