먼저, XGT FENET 통신 매뉴얼을 분석해 보자. [매뉴얼 첨부]
아래 그림 처럼 직접변수 M 메모리 영역을 읽고 쓰는 기능을 구현하려고 한다.
매뉴얼 '8장 전용통신' 부터 통신 프로토콜 설명이 있다.
매뉴얼에서는 XG5000으로 전용통신 설정이 설명되어 있지만..
이걸 자바를 이용해서 개발해 보려 한다.
위 그림의 'Application Data Format' 을 구현하여 보내고 받으면 되겠다.
헤더의 구조는 PLC와 프레임 구분 정보로 구성되어 있다.
여기서 클라이언트는 지금 만들고자 하는 프로그램이고 서버가 PLC 되겠다.
- PLC Info : 보낼때는 Don't care, 받을 땐 비트별로 여러 정보가 있는데 화면에 표시 하자.
- Invoke ID : 보낼때 지정해준 정보를 응답할때 사용할 것 같은 느낌.
- Length : Application Instruction Format의 바이트 갯수, 이 갯수와 Application Header
Format 바이트 갯수 (20bye) 가 전체 프레임의 바이트 갯수가 된다.
Application Instruction Format이라는데...Application Header Format 구성을 설명한다.
뭘까....
암튼 헤더 뒤에 붙어 있는 것들이 실제 데이터 영역인 듯 하다.
에러코드가 0x0000 이면 ACK, 그렇지 않으면 NAK
에러코드는 개발 진행 중에 참고하여 가능하면 표시하자.
프레임 구조를 살펴 봤는데....아직은 감이 오지 않는다.
실제 읽고 쓰는 구조를 보자.
이제 좀 명확하다.
헤더는 앞서 보았던 Application Header Format 정보가 들어가면 되겠다.
개별 읽기라의 의미가 변수 한개를 읽는 줄 알았는데 최대 16개의 변수를 읽을 수 있단다.
근데 변수길이는 왜 필요할까...?
직접변수 구분자를 쓰지 않은 이유는.... 모르겠다.
응답 프레임이다.
PLC -> HMI로 표시했는데 이 HMI가 바로 개발하고자 하는 프로그램 되겠다.
개별변수 읽기 이외에도 몇가지 더 있지만, 모두 읽다 지치지 말고 개별변수
읽기 요청, 응답 수신 하도록 만들어 보자.
TCP 통신, 2004 포트.. 우선 간단히 접속 정보 입력, 접속하기, 상태 표시 용 화면을 만들자.
우선 이렇게 디자인 했다.
- 접속할 PLC IP 주소와 포트(디폴트 2004 표시)를 입력하고 연결 버튼을 누르면 PLC와
TCP 접속을 시도하고 성공 여부를 상태 화면 (JList)에 한줄씩 표시한다.
- 연결되면 '연결' 버튼을 '끊기'로 변경하고 누르면 접속을 해제한다.
- JList는 최근 메시지를 최상위에 표시되도록 한다.
- JList에 표시되는 메시지는 매 건마다 날짜와 시간을 표시한다.
- 윈도우 'X' 버튼을 누르면 종료 확인 후 종료 처리
다음으로 ... 각각의 컴포넌트 이름을 정하자.
jtfIp(JTextField), jtfPort(JTextField), jbtConnect(JButton), jltMessage(JList)
[XgtFenet.java]
package xgtfenet;
import xgtfenet.ui.ConnectXgt;
/**
*
* @author zenE
*/
public class XgtFenet {
ConnectXgt connectXgt;
XgtFenet(){
this.connectXgt = new ConnectXgt("XGT 접속");
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
XgtFenet xgtFenet = new XgtFenet();
}
});
}
}
[ConnectXgt.java]
package xgtfenet.ui;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
/**
*
* @author zenE
*/
public class ConnectXgt extends javax.swing.JFrame {
/**
* Creates new form ConnectXgt
*/
public ConnectXgt(String title) {
setTitle(title);
initComponents();
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
if (JOptionPane.showConfirmDialog(ConnectXgt.this,
"종료합니까?", "종료 확인",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
System.exit(0);
}
}});
this.jtfIp.setText("127.0.0.1");
this.jtfPort.setText("2004");
Dimension frameSize = getSize();
Dimension windowSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((windowSize.width - frameSize.width) / 2,
(windowSize.height - frameSize.height) / 2); //화면 중앙
pack();
setVisible(true);
}
* 'initComponents();' 는 올리지 않았다. 자동생성 되니까..
<<메인 화면>>
<<종료 클릭 시 확인>>
[오늘은 여기까지~!]
'자바로 이것 해보기' 카테고리의 다른 글
LS산전 PLC M 영역 읽고 써보기_02 (0) | 2022.04.11 |
---|