跳到主要内容

DarraPnS

PROFINET IO Device 的入口。启动设备、写 Q / 读 I、看运行态和诊断。

本 SDK 只做 PROFINET IO Device,不提供其它现场总线协议的入口。

类结构

DarraPnS                                         // 设备实例

├── ProcessData → PnSProcessData // 过程数据,写 Q / 读 I
│ ├── InputsMapping<T>() / OutputsMapping<T>() // 0 拷贝,映射一次
│ ├── Read<T> / Write<T> / SubmitStruct<T> // 快照,值不会自己变
│ ├── In // 读 I(模块输入),只读
│ └── Out // 写 Q(模块输出),可写
├── Events → PnSEvents // 运行态事件
│ ├── ConnectedChanged // 周期交换通断
│ ├── StateChanged // 运行态变化
│ ├── ErrorOccurred // 运行错误
│ └── Logged // 上面每条都会再打这条
├── Variables → PnSVariables // 变量联想
├── Diagnostics → PnSDiagnostics // 诊断子对象(快照 / IOPS / 报警 / 记录)
│ ├── Snapshot // 诊断快照
│ ├── IoStatus // IOPS / IOCS
│ ├── Alarms / AlarmHistory // 本机报警 / 历史
│ └── Records // 用户区记录

├── Connected / State / WaitReason // 周期交换 / 运行态 / 等待原因
├── EverConnected / ErrorCode // 曾经连上 / 运行错误
└── ImData // I&M 标识

写 Q(模块输出,设备 → 控制器),读 I(模块输入,控制器 → 设备)。扁平属性 DiagSnapshot / Alarms 仍可用,与 Diagnostics 同一数据。

用法

启停

using Darra.PnS;

using (var device = new DarraPnS())
{
PnSErrorCode rc = device.Start();
if (rc != PnSErrorCode.Success)
return;

while (running)
{
if (!device.Connected)
{
// device.WaitReason
continue;
}
device.WriteBool("Q0.0", true); // 写 Q
device.ReadBool("I0.0", out bool fromPlc); // 读 I
}
device.Stop();
}

看状态不必 newDarraPnS.IsServiceReady / ServiceConnected / ServiceWaitReason

过程数据

方式访问说明
过程数据device.ProcessData.InputsMapping<T>() / OutputsMapping<T>()0 拷贝,映射一次
过程数据device.ProcessData快照 Read / WriteIn / Out 字节

标识

string name = device.ImData.StationName;
uint vendor = device.ImData.VendorId;
uint product = device.ImData.DeviceId;

过程数据读写

结构体必须 [StructLayout(LayoutKind.Sequential, Pack = 1)]。字 / 双字为大端。详见 过程数据

金路径是 0 拷贝:映射一次,源头变字段自己变。要宿主序数值走 Read / Write(大端编解码)。I 侧返回 ref readonly T 只读(控制器每周期整段覆盖,写 I 静默无效),Q 侧返回 ref T 可写。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct FromPlc
{
public byte A;
public short B;
public bool Flag;
}

// 0 拷贝:映射一次
ref readonly FromPlc inp = ref device.ProcessData.InputsMapping<FromPlc>();
ref FromPlc outp = ref device.ProcessData.OutputsMapping<FromPlc>();
byte present = inp.A; // 总线刷新后自己变(I 侧只读)
outp.A = 1; // 直接落 Q 过程映像

// 快照:拷出来不会自己变
FromPlc rx = new FromPlc();
device.ProcessData.Read(ref rx);

device.ProcessData.Out[0].Content = 0x11;
byte v = device.ProcessData.In[0].Content;

诊断与报警

通过 device.Diagnostics 读诊断(只读快照:链路、帧计数、看门狗、抖动与报警观测)。详见 诊断。事件见 事件

var snap = device.Diagnostics.Snapshot;
if (!snap.Ok)
Console.WriteLine(snap.Message);

foreach (var a in device.Diagnostics.Alarms)
Console.WriteLine(a.Message);