跳到主要内容

属性与状态机

提示
  • 初始化请参考 初始化 页面。
  • 过程数据(写 Q / 读 I)请参考 过程数据 页面。
  • 诊断功能请参考 诊断 页面。

属性​

类别属性类型访问说明
静态isServiceReady()boolean只读本机服务是否就绪
getLastError()String只读全应用最近一次失败文案(sticky,成功路径不清空)
getLastErrorCode()PnSErr只读全应用最近一次失败的调用错误码。从未失败为 OK
isServiceConnected()boolean只读主站是否周期交换。服务没起来 = false
getServiceState()PnSState只读运行态。服务没起来 = UNKNOWN
getServiceWaitReason()String只读等待原因。服务没起来 = 「服务未就绪」
getServiceStatusMessage()String只读状态文案。服务没起来 = 「服务未就绪」
连接与会话isConnected()boolean只读IO 控制器是否已经建立周期数据交换。true 才表示周期数据在换
isAttached()boolean只读本 SDK 会话是否已连上本机服务。stop 不改变
isStarted()boolean只读IO 设备是否已启用(start 之后、stop 之前)
运行态getStatus()PnSState只读运行态枚举。读不到真实状态为 UNKNOWN
getWaitReason()String只读本会话等待原因。主站已连时为空
isEverConnected()boolean只读是否曾与 IO 控制器建立过连接。true 且 isConnected 为 false = 掉线
错误码getErrorCodeEnum()PnSRuntimeErrorCode只读最近一次运行错误。未识别值 UNKNOWN
getErrorCodeRaw()int只读运行错误原值(0 = 无错误)。未识别值仍经本方法透传
getErrorMessage()String只读运行错误中文消息
getLastServiceError()String只读本会话最近一次失败文案(sticky,成功路径不清空)
诊断入口getEvents()PnSEvents只读运行态事件。见事件页
getDiagSnapshot()PnSDiagSnapshot只读诊断快照。字段见诊断页
getIoStatus()PnSIoStatus只读IOPS / IOCS。见诊断页
getProcessData()ProcessData只读过程数据。见过程数据页
本机会话getHost()String只读本会话连接的服务主机
getPort()int只读本会话连接的服务端口
PnSState

运行态类型。取值见 枚举参考。

PnSRuntimeErrorCode

运行错误码类型。取值见 枚举参考。

启停​

start()​

public void start()

启用 IO 设备。已 start 且尚未 stop 则直接返回。这不是主站已周期交换,主站是否在换数据看 isConnected()。

失败抛 PnSServiceException,并写入静态 getLastError()。

示例:

try {
device.start();
} catch (PnSServiceException e) {
System.err.println(PnSService.getLastError());
}

stop()​

public void stop()

停用 IO 设备。实例仍在,可再次 start()。未 start 或已 stop 则直接返回。失败写 getLastError,不抛。

不是 close():stop 不结束 SDK 会话。

示例:

device.stop();

运行态​

getStatus()​

运行态。start / stop 只管启用 / 停用 IO 设备;本方法始终按现场如实读。读不到真实状态为 UNKNOWN。不可达时抛 PnSServiceException。

public PnSState getStatus()

示例:

if (device.getStatus() == PnSState.DATA_EXCHANGE)
System.out.println("周期数据交换中");

getStatusEx()​

public ServiceStatus getStatusEx()

一次取回运行态、是否已交换、运行错误码。未建立会话 / 不可达抛 PnSServiceException。

ServiceStatus
public static final class ServiceStatus {
public PnSState getState() { }
public boolean isConnected() { }
public int getErrorCode() { }
public PnSRuntimeErrorCode getErrorCodeEnum() { }
public String getWaitReason() { }
public String getStatusMessage() { }
public int getAlarmCount() { }
public int getCriticalAlarmCount() { }
public boolean isEverConnected() { }
}

示例:

PnSService.ServiceStatus snap = device.getStatusEx();
if (!snap.isConnected())
System.out.println(snap.getState() + " " + snap.getWaitReason());

getWaitReason()​

public String getWaitReason()

本会话等待原因。主站已连时为空。循环 if (!device.isConnected()) 时读本方法或 getLastServiceError()。

示例:

if (!device.isConnected())
System.out.println(device.getWaitReason());

isEverConnected()​

public boolean isEverConnected()

是否曾与 IO 控制器建立过连接。false = 从未连过;true 且 isConnected() == false = 掉线。掉线后此判别仍保留。

示例:

if (!device.isConnected() && device.isEverConnected())
System.out.println("掉线");

错误码​

getErrorCodeEnum()​

public PnSRuntimeErrorCode getErrorCodeEnum()

最近一次运行错误(枚举)。未识别值 UNKNOWN。原值仍经 getErrorCodeRaw() 透传。中文消息用 getErrorMessage()。

示例:

PnSRuntimeErrorCode err = device.getErrorCodeEnum();
String text = device.getErrorMessage();
int raw = device.getErrorCodeRaw();

getErrorCodeRaw()​

public int getErrorCodeRaw()

运行错误原值(0 = 无错误)。未识别值仍经本方法透传。

示例:

int raw = device.getErrorCodeRaw();

getErrorMessage()​

public String getErrorMessage()

运行错误中文消息。未识别码返回带原值的说明,不丢信息。

示例:

System.out.println(device.getErrorMessage());

getLastServiceError()​

public String getLastServiceError()

本会话最近一次失败文案(sticky)。成功路径不清空。循环 if (!isConnected()) 时若本方法为空,读 getWaitReason()。

示例:

System.out.println(device.getLastServiceError());

诊断​

getDiagSnapshot()​

public PnSDiagSnapshot getDiagSnapshot()

一次取回链路、帧计数、看门狗、抖动。读不到时 isOk() == false,读 getMessage(),不视为异常。字段见 诊断。

示例:

PnSDiagSnapshot snap = device.getDiagSnapshot();
if (!snap.isOk())
System.out.println(snap.getMessage());

getIoStatus()​

public PnSIoStatus getIoStatus()

IOPS / IOCS 快照。0x80 = GOOD,0x00 = BAD。掉线如实全 BAD。读不到返回 PnSIoStatus.getEmpty()。字段见 诊断。

示例:

if (!device.getIoStatus().isAllGood())
System.out.println(device.getIoStatus().toString());

调用异常​

失败抛 PnSServiceException(继承 com.darra.pns.PnSSdkException,携带 PnSErr 错误码与细节)。

public class PnSServiceException extends PnSSdkException
类别属性类型访问说明
调用异常getMessage()String只读中文消息(码描述 + 细节)
getCode()PnSErr只读SDK 调用错误码
getDetail()String只读失败细节
getServerErrorCode()int只读运行错误原值。0 = 未携带

示例:

try {
device.writeInt16("QW0", (short) 1);
} catch (PnSServiceException e) {
System.err.println(e.getMessage());
System.err.println(e.getCode());
if (e.getServerErrorCode() != 0)
System.err.println(e.getServerErrorCode());
}

PnSErr​

SDK 调用错误码(0 = 成功)。取值见 枚举参考。

Java 现用正值编码,与其它语言负值制语义对应但数值不同。

静态 PnSService.getLastError() / getLastErrorCode() 在没有实例时读最近失败(sticky)。

完整示例​

import com.darra.pns.service.PnSService;
import com.darra.pns.service.PnSServiceException;

try (PnSService device = new PnSService()) {
device.start();
while (running) {
if (!device.isConnected()) {
System.out.println(device.getStatus());
System.out.println(device.getWaitReason());
System.out.println(device.getErrorMessage());
continue;
}

device.writeBool("Q0.0", true);
boolean fromPlc = device.readBool("I0.0");
}
device.stop();
} catch (PnSServiceException e) {
System.err.println(e.getMessage());
}