上位机
指可以直接发出操控命令的计算机,一般是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)可以使用
org.eclipse.milo
sdk-client
0.6.3
建立连接、数据读取、数据写入、数据订阅(具体代码就不一一列出来了)
// 创建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()
);
}
可以通过sdk-server辅助进行测试或者直连设备PLC进行测试
注:可通过UaExpert软件进行连接PLC,查看各种变量的值