跳到主要内容

Python API 参考

Darra Profinet Slave Python SDK(包名 darra_pns)。产品路径:PnSService.connect()start / 写 I / 读 Q / stop。命名用 Python 惯例(snake_case)。周期自由配置,最低 1 ms。

应用只做:start写 I读 Qstop

from darra_pns import PnSService

数据方向

方向应用该做什么
I(输入面)设备 → 控制器write / svc[i] = / pdo.Out[i] / write_bool("I0.0", …)
Q(输出面)控制器 → 设备read / svc[i] / pdo.In[i] / read_bool("Q0.0")。写 Q 失败

概览

职责
PnSService服务模式单一入口:connect() / start / stop / 写 I / 读 Q / 地址化 / pdo
Pdo / PdoArray / PdoDataItemETH 式 PDO:In 只读 Q,Out 可写 I
PnSServiceAddress / PnSServiceAreaHSL 式地址解析
PnSServiceStatus / PnSRuntimeErrorCode运行态快照 / 服务端错误码
PnSDevicenative 直连备选,不是产品路径

PnSService.connect()

from darra_pns import PnSService, PnSServiceError

with PnSService.connect() as svc:
svc.start()
svc.write(b"\x01\x02\x03\x04") # 写 I(设备 → 控制器)
q = svc.read() # 读 Q(控制器 → 设备)
print(q)
svc.stop()

生命周期:connectstart → 写 I / 读 Q / 地址化 / pdostopclose

成员类型类别读写说明
connect(host=None, port=None, api_key=None)PnSService设备静态本机会话。传 host 则连指定本机服务
start()None设备启动会话。已启动则直接返回
stop()None设备停止本会话。主站在连时不要拆应用关系
close()None设备释放会话。空会话 / 重复调用安全
is_connectedbool设备只读会话层是否仍有效(不是控制器 AR)
is_startedbool设备只读本会话是否已 start
host / portstr / int设备只读服务主机 / 端口
DEFAULT_PORTint设备只读本机服务默认端口

写 I / 读 Q

svc.write(b"\x01\x02\x03\x04")   # I
q = svc.read() # Q
print(svc[0]) # 从 PLC 读 Q[0]
svc[0] = 0xAA # 发给 PLC(写 I[0])
print(svc.input) # I 区快照(设备 → 控制器)
print(svc.output) # Q 区快照(控制器 → 设备)

允许短写。

成员类型类别读写说明
write(data)NoneIO写 I(设备 → 控制器)
read()bytesIO只读读 Q(控制器 → 设备)
svc[offset]intIO只读读 Q 一字节(从 PLC)
svc[offset] = valueNoneIO写 I 一字节(发给 PLC)
inputbytesIO只读I 区快照(设备 → 控制器)
outputbytesIO只读Q 区快照(控制器 → 设备)
get_io()(bytes, bytes)IO只读返回 (I, Q)。主 API 请用 read / write / input / output
read_area(area, offset, length)bytesIO只读整区批量读(I / Q / M)
write_area(area, offset, data)NoneIO整区批量写(仅 I / M)。写 Q 抛 PnSServiceError

地址化读写

HSL 式地址,与 C# PnSAddress.Parse 对齐。字 / 双字大端(PROFINET 网络序);偏移即字节偏移,不强制 2 / 4 对齐IW3 合法)。服务模式是单一线性过程区,DB 仅槽位 1 有效。

svc.write_bool("I0.0", True)      # 写 I 位
svc.write_int16("IW2", 0x1234) # 写 I 字(大端)
start = svc.read_bool("Q0.0") # 读 Q 位
cmd = svc.read_int16("QW2") # 读 Q 字
svc.write_bool("Q0.0", True) # 失败:Q 只读 → PnSServiceError
区域地址格式方向
I 区I0.0 / IB0 / IW2 / ID4设备 → 控制器允许
Q 区Q0.0 / QB0 / QW2 / QD4控制器 → 设备只读,写抛 PnSServiceErrorNOT_AVAILABLE,文案含「Q 区 … 只读」)
M 区M0.0 / MB0 / MW100 / MD0映射输入面允许
DB 区DB1.DBX0.0 / DB1.DBB2 / DB1.DBW0 / DB1.DBD4槽位 1 数据块写走 I 面;槽位 > 1 抛 PnSServiceError
成员类型类别读写说明
read_bool(address)boolIO只读位:I0.0 / Q0.0 / M1.6 / DB1.DBX0.0
write_bool(address, value)NoneIO写位(I / M / DB)。写 Q 失败
read_int16(address)intIO只读字:IW2 / QW2 / MW0 / DB1.DBW0,大端
write_int16(address, value)NoneIO写字(I / M / DB)。写 Q 失败
read_int32(address)intIO只读双字:ID4 / QD4 / MD0 / DB1.DBD4,大端
write_int32(address, value)NoneIO写双字(I / M / DB)。写 Q 失败
parse_address(text)PnSServiceAddressIO静态解析 HSL 式地址

PDO:In 读 Q / Out 写 I

对齐 ETH PDOArrayInstance / PdoDataItemIn 是合法标识符(主属性名);inn 是同一数组别名。偏移是过程映像字节地址。

pdo = svc.pdo
print(pdo.In[0].content) # 读 Q[0](控制器 → 设备),只读
pdo.Out[0].content = 0x11 # 写 I[0](设备 → 控制器)
pdo.Out[2].as_int16 = -2 # 大端 Int16
status, pos = pdo.read_struct("Hi")
pdo.write_struct("Hi", 1, -2)
pdo.In[0].content = 1 # 失败:RuntimeError(In 只读,写请用 Out)
成员类型类别读写说明
pdoPdoPDO只读懒创建。In = Q 只读,Out = I 可写
pdo.In / pdo.innPdoArrayPDO只读In[i].content 读 Q。写 In 抛 RuntimeError
pdo.OutPdoArrayPDO读写Out[i].content = v 写 I;Out[i] = v 等价
PdoArray.lengthintPDO只读当前过程映像字节长度
PdoDataItem.contentintPDO读写1 字节。In 读 Q;Out 写 / 回读 I
as_int16 / as_uint16intPDO读写大端 16 位(写仅 Out)
as_int32 / as_uint32intPDO读写大端 32 位(写仅 Out)
as_floatfloatPDO读写大端 float(写仅 Out)
get_bit(bit) / set_bit(bit, value)bool / NonePDO读写本字节位 0–7。set_bit 仅 Out
read_struct(fmt)tuplePDO只读从 Q struct.unpack('>'+fmt)
write_struct(fmt, *values)NonePDO大端 pack 后整段写 I
inputs_mapping(fmt=None)bytes / tuplePDO只读Q 区快照;有 fmt 则 unpack
copy_inputs_to(buf)intPDO只读把当前 Q 拷到调用方缓冲
copy_to_outputs(src)intPDO把调用方缓冲写入 I(允许短写)

运行态

已启动时 state / connected 读运行态。error_code 主返回枚举,不要把裸 int 当主 API。

成员类型类别读写说明
statePnSState设备只读运行态。未启动 = NONE
connectedbool设备只读是否已与 IO 控制器建立周期数据交换
error_codePnSRuntimeErrorCode设备只读枚举主返回。未识别 = UNKNOWN
error_code_enumPnSRuntimeErrorCode设备只读旧名,转调 error_code
status()str设备只读状态原文字符串(诊断用)
status_ex()PnSServiceStatus设备只读一次取回 state / connected / error_code

PnSStateNONE / IDLE / CONNECTING / PARAMETERIZED / APPLICATION_READY / DATA_EXCHANGE / ABORTED / RESETTING / CONFIG_ERROR / UNKNOWN

PnSRuntimeErrorCodeOK=0 / ERR_INIT=-1 / ERR_CFG=-2 / ERR_THREAD=-3 / ERR_RUNNING=-4 / ERR_PDI=-5 / ERR_DAP=-6 / ERR_NULL=-8 / ERR_DIAG=-9 / UNKNOWN=-10000。

get_state / get_error_code / get_connected / get_input / get_output 一律转调上表属性,不是主 API。

服务接口

PnSService.connect("127.0.0.1") 连本机服务。过程数据仍应走无 host 的 connect()

成员类型类别读写说明
get_alarms()list[PnSServiceAlarm]报警只读活动报警
ack_alarm(id) / ack_all_alarms()None / int报警确认单条 / 全部
send_process_alarm(slot, subslot, usi, payload=None)None报警发送过程报警
get_im_data()PnSServiceImData标识只读I&M
get_records()PnSServiceRecords记录只读应用参数记录
reset_device(mode)None设备复位(communication / factory

薄 SDK 无配置下发。网卡 / 站名由 GUI → 运行配置 XML → Service 加载。设备对外只开放一个 PROFINET 网口。

完整示例

from darra_pns import PnSService, PnSServiceError

with PnSService.connect() as svc:
svc.start()
svc.write(b"\x01\x02\x03\x04")
q = svc.read()
print(q)

svc.write_bool("I0.0", True)
print("Q0.0 =", svc.read_bool("Q0.0"))

svc.pdo.Out[1].content = 0x22
print("In[1] =", svc.pdo.In[1].content)

try:
svc.write_bool("Q0.0", True)
except PnSServiceError as e:
print("Q 只读:", e)

svc.stop()

安装

pip install darra-pns

或本地源码:

cd Darra_PnS_SDK/Python
pip install -e .

运行前提:Darra Profinet Slave 服务已启动,驱动已就绪(Windows,通常需管理员)。

native 直连(备选)

PnSDevice / PnSlave / PnSIo 仍导出。产品路径是上面的 PnSService.connect()。不要把 native 当默认入口。

相关