Java接收三菱plc发送的数据

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甚至更大的数,我在开发的时候,就遇到,将数组撑串位,

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

特此记录下。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值