두번째 시간..
PLC가 없으니 우선 TCP 접속, 프로토콜 전송, 응답 수신 테스트를 위해 J1C를 사용해서
Server역할을 대행한다.
J1C.exe[http://www.j1lab.com/]
J1C - 시리얼 통신 프로그램
www.j1lab.com
J1C를 개발하신 분에게 감사드립니다.
우선 01편에서 제작한 UI에서 '연결' 버튼을 누르면 LocalHost(127.0.0.1), 2004 포트로 연결을
시도하고 연결된 이후 특정 메시지를 J1C로 송신하도록 작성하자.
송신 이후에 즉시 서버의 응답을 기다리고 응답을 수신하면 JList에 메시지 로그를 출력한다.
아래 그림은 송수신 실행 화면이다.
J1C와 Socket 연결은 10초의 타임아웃을 설정했다.
10초동안 J1C로 부터 응답이 없으면 연결을 종료한다.
추가된 코드는 다음과 같다.
[ConnectXgt.java] 에 추가된 내역
public ConnectXgt(String title) {
setTitle(title);
initComponents();
logListModel = new DefaultListModel();
this.jltMessage.setModel(logListModel);
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);
}
- 생성자 안에서 DefaultListModel을 생성하고 JList에 모델 설정
private void addProtocolLog(byte[] bs, int start, int length){
String s = new String(bs, start, length);
logListModel.add(0, s);
}
- JList에 송수신 메시지를 출력할 메소드 추가
class PlcClient implements Runnable{
Socket socket;
BufferedInputStream bis;
BufferedOutputStream bos;
boolean running;
PlcClient(Socket socket) throws Exception{
socket.setSoTimeout(10 * 1000);
this.socket = socket;
bis = new BufferedInputStream(socket.getInputStream());
bos = new BufferedOutputStream(socket.getOutputStream());
running = true;
}
@Override
public void run(){
ByteBuffer buffer = ByteBuffer.allocate(1024);
StringBuilder sb = new StringBuilder();
byte[] bs = "Request M memory values".getBytes();
int count = 0;
try{
while(running){
bos.write(bs);
bos.flush();
count = bis.read(buffer.array());
if(count == -1){
running = false; continue;
}
for(int i=0;i<count;i++){
sb.append(String.format("%02X ", buffer.get(i)));
}
addProtocolLog(buffer.array(), 0, count);
sb.setLength(0);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
running = false;
if(bis != null) bis.close();
if(bos != null) bos.close();
if(socket != null) socket.close();
}catch(Exception e){
}
}
}
}
- J1C와 연결되면 생성되는 Client thread
- 연결 이후 "Request M memory values"를 송신하고 응답 대기
- socket.setSoTimeout(10 * 1000); //10초동안 J1C 응답이 없으면 연결 해제
'연결'버튼 클릭 이벤트
private void jbtConnectActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
this.jtfIp.setText("127.0.0.1");
this.jtfPort.setText("2004");
String ip = jtfIp.getText().trim();
int port = Integer.parseInt(jtfPort.getText().trim());
try{
Socket socket = new Socket(ip, port);
PlcClient plcClient = new PlcClient(socket);
Thread thread = new Thread(plcClient);
thread.start();
}catch(Exception e){
e.printStackTrace();
}
}
실행 화면
- J1C 'TCP Option'에서 IP (127.0.0.1), Port(2004), 'Server' 선택하고 'Connect' 클릭
- 연결된 직후 "Request M memory values"를 송신
- J1C에서 수신 확인
- 'Here you are' 입력 후 'Send' 클릭
오늘은 '여기까지'
* 소스
* 개발환경
'자바로 이것 해보기' 카테고리의 다른 글
LS산전 PLC M 영역 읽고 써보기_01 (0) | 2022.04.10 |
---|