Java接收三菱plc发送的数据

  • Post author:
  • Post category:java



Java接收三菱plc发送的数据


一、需求

plc做服务端,Java做客户端,将焊机电流,报警信息,焊接工件数量等信息传送到java端,数据保存到数据库,进行web展示等。


二、实现方式

作为java开发程序员,常使用byte数组进行输入流操作,所以这次也采用这种操作;

public void receive_plc_data(){

    Socket socket = new Socket("192.168.0.10",3000);
    InputStream is;
    while(true){
        is = socket.getInputStream();
        //plc发送22位数据,plc一位对应byte数组中四位
        byte[] byte = new byte[88];
        int readLength = -1;
        if((readLength = is.read(b,0,88)) != -1){
        //转16进制
        String result = bytesToHexString_b(byte);
        //转换成10进制
         List<Integer> state_list = dataProcess(result);
         //业务处理。。。
        }

    }

}

private static List<Integer> dataProcess(String result) {
        List<Integer> list = new ArrayList<>();
        //字符串长度
        int string_len = result.length();
        for (int i =0;i< string_len;){
            String string_poi = "";
            if (4+i > string_len){
                string_poi =result.substring(i);
            }else {
                string_poi = result.substring(i,4+i);
            }
            String data_index_one = string_poi.substring(0,2);
            String data_index_two = string_poi.substring(2,4);
            Integer number = Integer.parseInt(data_index_two+data_index_one,16);
            list.add(number);
            i+=4;
        }
        return list;
}


private static String bytesToHexString_b(byte[] bytes){

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < bytes.length; i++) {
       String hex = Integer.toHexString(0xFF & bytes[i]);
       if (hex.length() == 1) {
          sb.append('0');
        }
        sb.append(hex);
     }
   return sb.toString();
}


三、注意:

plc发给我们的数据是反的。

上面说,plc发送22个数据,假设第一个数据发送1000,我们接收到的16进制1027,实际10000对应的16进制是2710,发现问题了吧。

就是将最后两位与头两位位置对调。在转10十进制的时候,我已经这么操作了。


四、总结:


byte数组接收小于127的正整数时,无需任何操作,就怕发送大于127的数,比如1000,100000甚至更大的数,我在开发的时候,就遇到,将数组撑串位,


导致下面的数据状态判定,全错。


特此记录下。



版权声明:本文为qq_36454470原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。