• Java与设备(PLC)通信


    通信名词

    • 上位机
      指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer
      控制者和提供服务者是上位机;工控机、工作站、触摸屏可作为上位机

    • 下位机
      直接控制设备,获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer
      被控制者和被服务者是下位机

    • PLC
      Programmable Logic Controller,可编辑逻辑控制器,是专门在工业环境下应用而设计的数字运算操作电子系统。
      采用一种可编辑的存储器,在其内部存储执行逻辑运算、顺序控制、定时、计数和算数运算等操作的指令,通过数字式或模拟式的输入输出来控制各种类型的机械设备和生产过程。

    • UPAPP
      Upper Computer Application上位机软件,指可以直接发出操控命令的软件,可操控测试、仪器、数据采集等。
      向下通过OPCUA、RS232、485、TCP/IP等协议与PLC、板卡、设备等实现通讯与控制;向上协调MES与下位机动作控制,实现系统的自动化运行。
      通常与MySQL等常用数据库存储数据,实现数据追溯查询。

    通信原理

    当需要通过Java程序去控制设备进行操作,这时候就需要实现与设备之间的通信。在这里,其实与设备通信,本质就相当于是和PLC通信,此时我们的系统可以理解为上位机程序。
    在上位机中部署我们的应用后就可以在上位机进行操作,如下发指令、读取设备数据等。整个通信的链路是上位机下发任务,传给下位机(前面有说到下位机可以是PLC),所有的交互都是在PLC的寄存器中,寄存器里面会建立相应变量,服务端PLC可以去发布订阅、客户端也可以去发布订阅所需要的变量,从而当检测到某个变量值发生变化时会触发相应的操作。
    比如下发开机指令,可以在寄存器中建立一个变量openDevice,双方约定0代表开机,1代表关机,上位机通过和PLC建立连接,将openDevice置为1,由于PLC订阅了此变量,当检测到此变量为1时候,它明白应该下发开机指令,通过其PLC相关开机编码达到设备自动开机。

    实现方式

    Java中有相应的Jar包(milo)可以使用

    1.引入Jar
    
    	org.eclipse.milo
    	sdk-client
    	0.6.3
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2.编写工具类

    建立连接、数据读取、数据写入、数据订阅(具体代码就不一一列出来了)

    // 创建OPC UA客户端
    private static OpcUaClient createClient() throws Exception {
      //opc ua服务端地址
      private final static String endPointUrl = "opc.tcp://192.168.0.169:49320";
      Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security");
      Files.createDirectories(securityTempDir);
      if (!Files.exists(securityTempDir)) {
        throw new Exception("unable to create security dir: " + securityTempDir);
      }
      return OpcUaClient.create(endPointUrl,
                                endpoints ->
                                endpoints.stream()
                                .filter(e -> e.getSecurityPolicyUri().equals(SecurityPolicy.None.getUri()))
                                .findFirst(),
                                configBuilder ->
                                configBuilder
                                .setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
                                .setApplicationUri("urn:eclipse:milo:examples:client")
                                //访问方式
                                .setIdentityProvider(new AnonymousProvider())
                                .setRequestTimeout(UInteger.valueOf(5000))
                                .build()
                               );
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    3.测试

    可以通过sdk-server辅助进行测试或者直连设备PLC进行测试

    注:可通过UaExpert软件进行连接PLC,查看各种变量的值

  • 相关阅读:
    元宇宙003 | 在虚拟现实中感受到的压力真实吗?
    js遍历数组和对象的常用方法
    文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题
    liunx 磁盘分区格式报错问题及挂载步骤
    Spring依赖注入源码分析
    Java中的抽象类和接口的区别
    Golang import
    canvas基础4 -- 图像
    教程六 在Go中使用Energy创建跨平台GUI - 应用下载事件
    神经网络的发展历史
  • 原文地址:https://blog.csdn.net/qq_36092584/article/details/126874539