API 통신 라이브러리 (comm Library)를 사용한
애플릿 예

sampleApplet1.gif (1876 bytes)

일반적으로 웹 브라우저에서 실행시킬 수 있는 PLC 제어 GUI 애플릿을 자바 API 라이브러리를 이용하여 만든다는 것은 결코 쉬운 일이 아닙니다. 하지만 좌측 그림에 있는 예제 애플릿은 우리의 API를 사용하여 매우 쉽게 만들 수가 있습니다. 이 애플릿은 원격 PLC로부터 리얼타임클럭 데이터 및 입력 #1과 출력 #1의 로직 상태를 원격 수신하여 계속적으로 디스플레이하는 것입니다. "Input #1"의 라벨은 초록 색의 밝기 차이를 이용하여 PLC의 입력 #1 (Input #1)의 ON/OFF상태를 표시합니다. "Output #1" 라벨을 클릭할 때 PLC의 출력 #1을 강제로 토글시키는 푸쉬버튼입니다. 출력 #1 (Output #1)의 상태는 적색 버튼의 밝기 차이에 의해 그 상태를 표시합니다.

이 예제 애플릿의 완전한 소스 코드 리스트를 이곳 아래에 올려 놓았습니다. 아래 많은 프로그램 문장들 중에서 굵은 파란색의 문자들 만이 실제로 API 라이브러리하고 관계된 것입니다. 나머지 부분은 대부분의 자바 프로그램머들에게 이미 익숙해있는 평범한 자바 AWT입니다. PLC 자바 통신 라이브러리 "PLCmon.jar"에 대하여 더 공부를 하고 싶으신 분은 여기를 클릭하시기 바랍니다.

여러분은 또한 다른 플랫폼 상에서 실행 시킬 수 있는 여러분 자신만의 자바 어플리케이션 프로그램을 만들 수 있습니다. 왼쪽 사진은 Personal Java JVM (Sun 사이트에서 무료로 다운로드 받을 수 있음)을 설치한 HP Jornada Pocket PC상에서 똑같은 자바 프로그램으로 실행되고 있는 것을 보여주고 있습니다. PLC의 입력 #1 (Input #1) 및 출력 #1 (Output #1)의 로직 상태, 그리고 PLC 리얼타임클럭의 시간을 원격으로 읽을 수 있으며 출력 #1 (Output #1) 라벨을 클릭하면 PLC 출력 #1을 강제로 토글시킬 수 있습니다.

API 통신 라이브러리는 PC상에서 자신만의 자바 프로그램을 쉽게 작성하고 테스트를 해볼 수 있도록 하여 줍니다. 또한 작성된 프로그램을 간단하게 다른 플랫폼 또는 PDA에 설치하고 실행 시킬 수 있습니다. PDA 사진을 클릭하시면 큰 PDA 사진을 보실 수 있습니다.

import PLCmon.*;
import java.awt.*;
import java.applet.*;

public class TestApplet extends Applet
{
    String URLString = "127.0.0.1:9080"; // a localhost connection
    String username = "samples";
    String password = "";

    int [] DM = new int[4000]; // place holder for the Data Memory DM[1] to DM[4000]
    ConnectTLServer ctlsvr;
    Color darkGreen = new java.awt.Color(0,128,0);
    Color darkRed = new java.awt.Color(128,0,0);
    public void init()
    {
        //{{INIT_CONTROLS
        setLayout(null);
        setSize(120,120);
        panel1.setLayout(null);
        add(panel1);
        panel1.setBackground(new java.awt.Color(255,255,128));
        panel1.setBounds(0,0,120,120);
        RTC.setEditable(false);
        RTC.setText("Hello");
        panel1.add(RTC);
        RTC.setBackground(java.awt.Color.black);
        RTC.setForeground(java.awt.Color.red);
        RTC.setFont(new Font("Dialog", Font.BOLD, 16));
        RTC.setBounds(20,20,87,24);
        clockLabel.setText("PLC\'s Clock");
        clockLabel.setAlignment(java.awt.Label.CENTER);
        panel1.add(clockLabel);
        clockLabel.setBounds(20,0,84,24);
        output1Button.setLabel("Output1");
        panel1.add(output1Button);
        output1Button.setBackground(new java.awt.Color(128,0,0));
        output1Button.setForeground(java.awt.Color.yellow);
        output1Button.setFont(new Font("Dialog", Font.BOLD, 12));
        output1Button.setBounds(20,80,84,22);
        input1Label.setText("Input #1");
        input1Label.setAlignment(java.awt.Label.CENTER);
        panel1.add(input1Label);
        input1Label.setBackground(new java.awt.Color(0,128,0));
        input1Label.setForeground(java.awt.Color.yellow);
        input1Label.setFont(new Font("Dialog", Font.BOLD, 12));
        input1Label.setBounds(20,48,84,22);
        //}}
       
        ctlsvr = new ConnectTLServer(URLString, username, password);
        MonitorThread mt = new MonitorThread();
        mt.start();
   
        //{{REGISTER_LISTENERS
        SymMouse aSymMouse = new SymMouse();
        output1Button.addMouseListener(aSymMouse);
        //}}
    }
   
    //{{DECLARE_CONTROLS
    java.awt.Panel panel1 = new java.awt.Panel();
    java.awt.TextField RTC = new java.awt.TextField();
    java.awt.Label clockLabel = new java.awt.Label();
    java.awt.Button output1Button = new java.awt.Button();
    java.awt.Label input1Label = new java.awt.Label();
    //}}
   

    class MonitorThread extends Thread {
        private Action monAction[] = new Action[10]; // Don't make these monAction[] variable public
        public void run() { // to avoid writing action[] variables in other threds
            while (true) { // run forever (until program exits)
                readRTC(); // add the list of actions you wish to monitor here
                readIO();
                try {
                    Thread.sleep(200); // update every 0.2 second
                } catch (Exception e){}
            }
        }
   
        void readIO() { // Read the logic state of the inputs and outputs
            monAction[0] = new Action(1,ActionConstant.READSINGLE,ActionConstant.INPUT,1,0); // Read INPUT[1]
            monAction[1] = new Action(1,ActionConstant.READSINGLE,ActionConstant.OUTPUT,1,0); // Read OUTPUT[1]
            try {
                ctlsvr.commAction(monAction, 2); // Execute the two READ actions defined above
                if ((monAction[0].value & 0x0001)!=0) { // Test bit 0 of 16-bit variable INPUT[1]
                    input1Label.setBackground(Color.green); // it is ON, light up the label in GREEN
                }
                else {
                    input1Label.setBackground(darkGreen); // it is OFF, dim the label as dark green.
                }
                if ((monAction[1].value & 0x0001)!=0) { // Test bit 0 of 16-bit variable OUTPUT[1]
                    output1Button.setBackground(Color.red); // it is ON, light up the label in GREEN
                }
                else {
                    output1Button.setBackground(darkRed); // it is OFF, dim the label as dark green.
                }
            }
            catch (Exception e) {
                RTC.setText(e.toString()); // show the error message
                System.out.println(e);
            }
        }

        public void readRTC() { // Read the read time clock: Hours, Minutes and Seconds.
                            // the returned value for READSINGLE is contained in the integer variable "value".
            monAction[0] = new Action(1,ActionConstant.READSINGLE,ActionConstant.TIME ,1,0); // Read Hour
            monAction[1] = new Action(1,ActionConstant.READSINGLE,ActionConstant.TIME, 2,0); // Read Minute
            monAction[2] = new Action(1,ActionConstant.READSINGLE,ActionConstant.TIME, 3,0); // Read Second
   
            try {
                ctlsvr.commAction(monAction, 3); // Execute 3 actions defined above
                String RTCvalue = monAction[0].value +":"+ monAction[1].value+":"+ monAction[2].value;
                RTC.setText(RTCvalue);
            }
            catch (Exception e) {
                RTC.setText(e.toString()); // show the error message
                System.out.println(e);
            }
        }
    }

    class SymMouse extends java.awt.event.MouseAdapter
    {
        public void mouseReleased(java.awt.event.MouseEvent event)
        {
            Object object = event.getSource();
            if (object == output1Button)
                output1Button_MouseReleased(event);
        }

        public void mousePressed(java.awt.event.MouseEvent event)
        {
            Object object = event.getSource();
            if (object == output1Button)
                output1Button_MousePressed(event);
        }
    }
   

    void output1Button_MousePressed(java.awt.event.MouseEvent event) {
        Action writeAction[] = new Action[10];
            // to do: code goes here.
        writeAction[0] = new Action(1,ActionConstant.READSINGLE,ActionConstant.OUTPUT ,1,0); // Read OUTPUT[1]
        try {
            ctlsvr.commAction(writeAction, 1); // Execute 1 action defined above
            writeAction[0].actionType = ActionConstant.WRITESINGLE; // change to WRITESINGLE OUTPUT
            writeAction[0].value ^= 0x0001; // Toggle OUTPUT[1] bit 0
            ctlsvr.commAction(writeAction, 1); // Execute the action;
        }
        catch (Exception e) {
            RTC.setText(e.toString()); // show the error message
            System.out.println(e);
        }
    }

    void output1Button_MouseReleased(java.awt.event.MouseEvent event)
    {
        // to do: code goes here.
    }
}

서울특별시 영등포구 여의도동 44-35 (제일빌딩 806호)
TEL:
(02) 872-7447 FAX:(02) 761-6774