Java SDK 概述
开发 PROFINET IO Device 应用的 Java 类库。代码里 import com.darra.pns.service.PnSService;。
安装
从 Maven Central 安装:
<dependency>
<groupId>xyz.darra</groupId>
<artifactId>darra-profinet-slave</artifactId>
<version>1.6.3</version>
</dependency>
Gradle:
implementation 'xyz.darra:darra-profinet-slave:1.6.3'
包页面:central.sonatype.com/artifact/xyz.darra/darra-profinet-slave
也可从下载页下载 darra-profinet-slave.jar,或用安装目录 SDK\SDK_Java\ 里的副本。
环境
- Windows 10 / 11 x64
- JDK 11+
- 已装 Darra Profinet Slave
快速开始
Start 之后把 I / Q 映射一次成结构体,然后一直用这个变量读写字段。结构体映射在过程映像上,源头变字段自己变;readStruct / writeStruct 是快照,拷出来的实例不会自己变。I 区只读:元素口 / 地址口 / 整区口写 I 会被拒(UnsupportedOperationException / PnSServiceException),I 映射上的 write() 则写了等于没写。
周期交换自动进行,不必自写周期循环;读可并发,写请调用方串行化。Java 的 Structure 字段是托管缓存:改 outp 后要 write() 才进映像,读最新 inp 要 read()。
import com.darra.pns.service.PnSService;
import com.darra.pns.service.PnSServiceException;
import com.sun.jna.Structure;
import com.sun.jna.Structure.FieldOrder;
@FieldOrder({"present", "recipe"})
class FromPlc extends Structure { // I:控制器 → 设备
public byte present;
public short recipe;
public FromPlc() { super(ALIGN_NONE); }
}
@FieldOrder({"ready", "busy"})
class ToPlc extends Structure { // Q:设备 → 控制器
public byte ready;
public byte busy;
public ToPlc() { super(ALIGN_NONE); }
}
try (PnSService device = new PnSService()) {
device.start();
// 映射一次
FromPlc inp = device.getProcessData().getInputsMapping(FromPlc.class);
ToPlc outp = device.getProcessData().getOutputsMapping(ToPlc.class);
while (running) {
if (!device.isConnected())
continue;
inp.read(); // 过程映像 → 托管缓存
byte present = inp.present; // 读 I:总线刷新后自己变
outp.ready = 1;
outp.write(); // 写 Q:托管缓存 → 过程映像
}
device.stop();
} catch (PnSServiceException e) {
System.err.println(e.getMessage());
}
快照走 readStruct / writeStruct(实现 ProcessData.Packed)—— 拷出来的实例不会自己变。