此项目的逻辑性较强,重点部分是捋顺逻辑,讲清思路
重点模块为:车辆入库模块,自动上料模块
首先说一下整体的厂内情况及运营流程(结合下面的图会更好理解):
首先炼钢厂有三类仓库:合金仓库,地下料仓,高位料仓,下图能很好地看到
因为在整个运转过程中,是需要添加原材料的,所以这里就以拉原料的卡车为出发点。
首先卡车拉着一车的原材料比如(萤石球)放入合金仓库或者地下料仓均可,实际生产的过程中限定了品种对应哪个仓库,这里因为是大致流程就不说这么细致了,能讲清大致流程就好
原材料有两个路线:
- 送入合金库,然后通过铲车送到地下料仓,然后根据存放原料的地下料仓号的奇偶来判断从运送的是哪根皮带,奇数是皮带1,偶数是皮带2,高位料仓通过plc(可编程控制器,下面会详细讲解)进行控制上料是否开始及完成等信号,最后将原材料分别加到对应的炼钢炉里面。
- 直接送入地下料仓,后序操作跟上面的相同。
车辆入库模块:
是上图中的这部分,拉原料的卡车在进入工厂之前,会在门口处被录入车牌号,货物品种,货物重量,订单编号等一系列信息,然后数据发送方会在局域网内通过socket给我们(数据接收方,需要通过向日葵远程连接对方内网主机进行获取)以电文的形式进行发送数据,电文格式如下:
/IP:端口号 已经断开连接 /IP:端口号 已经断开连接/IP:端口号 发来数据为JNLM01的是:0852JNLM0120221123181851JNLMDIBGDS2211230737 JM2211230024闽AA9983 A6035202 石灰石筛粉 炼钢厂二区 炼铁厂 000000536200000002174000000031880202211231750152022112318184520221123175015
可以看到这些电文我们无法直接拿来用,我们需要进行解析,将对应的数据传给对应的字段,然后存到我们的数据库里面。
那么问题来了,我们如何创建socket呢?
服务端:
import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; //服务端 public class TcpServer { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(9000);//建立端口号为9000 Socket socket = serverSocket.accept();//等待客户端的连接 InputStream is = socket.getInputStream();//接受客户端的信息流 //接受信息代码模块 byte[] buffer = new byte[1024]; int len; while ((len=is.read(buffer))!=-1) { String msg = new String(buffer, 0, len); System.out.println(msg); } } catch (IOException e) { e.printStackTrace(); } } }
客户端:
import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.nio.charset.StandardCharsets; //客户端 public class TcpClient { public static void main(String[] args) { try { InetAddress byName = InetAddress.getByName("127.0.0.1");//ip地址 int port=9000;//端口号 Socket socket = new Socket(byName, port);//建立一个socket连接 OutputStream ou = socket.getOutputStream();//发送io流 ou.write("你好,李焕英".getBytes(StandardCharsets.UTF_8));//getBytes()是将String字符串转换为Byte数组 } catch (Exception e) { e.printStackTrace(); } } }
然后是解析电文字符串:
从以上的电文中可以看到:电文中存在好多空格,而且这些电文数据的长短也是不一样的,无法直接通过位数进行截取
采用的方式是:
- 首先采用分割字符串的函数split(" ");让所有的字符串按一个空格进行分割,分割完的结果是( 车号 )(品种)( 重量)等,可以看到这些子字符串里面仍然含有空格。
- 然后采用trim(),即可以对每个子字符串进行去空格操作,然后再拼接子字符长,拼接好的效果是 :车号(空格)品种(空格)重量等,可以看到他们之间已经就只存在一个空格,然后这就可以看成我们熟悉的数组
- 我们可以再次利用split(),将该字符串进行分割,然后存入数组,供我们使用,后序的存入数据库就不在过多的描述。
存入数据库之后,我们的前端页面会把这些车辆的具体信息,以列表的形式进行展示,并且在每一行的后面附有操作按钮,控制其是否入库。(不方便贴页面,想了解可留言),其入库操作就是将控制字段从0改为1,然后对应物料的重量进行累加,在进行sql查找的时候只查找满足没有入库条件的信息。
自动上料模块:
在了解这部分之前首先要知道每个炼钢炉都有对应的报警线,当炉内原料的剩余量低于对应的报警线时,就需要上料,之前都是人工盯着报警线上料的,这样既不安全,也不高效,那怎么实现的自动上料呢?
在这个过程中opc(可编程控制器)立了大功,其主要是连接系统软件以及设备硬件的中间桥梁,软件系统通过给它发送指令来控制硬件设备,硬件设备通过给它发送数据供软件系统进行下一步操作。
opc的界面如图所示:
自动上料模块的功能流程图如下图所示:
标签:炼钢厂,java,socket,系统,空格,import,料仓,电文,经验总结 From: https://www.cnblogs.com/YuQiLe/p/16921317.html