본문 바로가기

자바로 이것 해보기

LS산전 PLC M 영역 읽고 써보기_01

먼저, XGT FENET 통신 매뉴얼을 분석해 보자. [매뉴얼 첨부]

사용설명서_XGT FEnet_국문_V2.0_160412.pdf
6.36MB

아래 그림 처럼 직접변수 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