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 版权协议,转载请附上原文出处链接和本声明。