常用操作
除完整程序外,下面片段中的 client 均指已完成 TCP 或串口关联的 Client。点位和参数须按实际设备选择。
串口与超时配置
from dlt698 import Client, ClientOptions, Oad, SessionOptions
from dlt698.transport import SerialLinkOptions, SerialOptions
options = ClientOptions(protocol=SessionOptions(request_timeout=2.0))
serial = SerialOptions(baud_rate=9600)
link = SerialLinkOptions(baud_rate=9600, bits_per_character=11)
with Client(options) as client:
client.open_serial_configured("COM3", serial, link)
print(client.get(Oad(oi=0x200F, attribute=2)).require_data().as_uint16())
需连接真实设备;Linux 端口可改为 /dev/ttyUSB0。默认字格式为 8E1;保持字格式、波特率和 bits_per_character 一致。简单配置也可使用 client.open_serial("COM3", 9600)。现场方向控制、排空及间隔要求见串口连接。
超时单位为秒,要求有限、非负且为毫秒精度。嵌套配置读取返回副本,修改后需赋回:
protocol = options.protocol
protocol.request_timeout = 3.0
options.protocol = protocol # 在创建 Client 前修改配置
Data 与编解码
from dlt698 import Data, decode_data, encode_data
value = Data.uint16(5000)
wire = encode_data(value)
print(wire.hex()) # 121388
print(decode_data(wire).as_uint16()) # 5000
values = Data.array([Data.uint16(1), Data.uint16(2)])
print([item.as_uint16() for item in values.value]) # [1, 2]
用工厂明确标签:Data.uint16(...)、Data.int32(...)、Data.octet_string(b"...") 等;整数工厂拒绝 bool 和溢出,访问器要求标签匹配。字节输入接受 bytes、bytearray 或连续一维单字节 memoryview,并复制拥有。详细类型与编码见 Data 精确类型和Data 编解码。
OAD、工程量与批量读取
from dlt698 import Data, Oad
from dlt698.standard import decimal_text, engineering_values, unit_symbol
frequency = Oad(oi=0x200F, attribute=2, index=0)
value = client.get(frequency).require_data()
for number in engineering_values(frequency, value):
print(decimal_text(number), unit_symbol(number.scaling.unit))
response = client.get_list([frequency, Oad(oi=0xF001, attribute=2)])
for item in response.attributes:
if isinstance(item.result, Data):
print(item.attribute.oi, item.result.type, item.result.value)
else:
print(item.attribute.oi, "DAR", item.result)
0xF001 用来展示可能缺失的点位,替换为实际所需对象。列表保留请求顺序和逐项成功/失败;不要假设所有返回值都是 Data。工程量转换根据标准目录和布局进行校验,详细地址及倍率见看懂数据地址、标准固定点位和一次读取多个数据。
写参数与执行方法
以下函数用于已确认可写的属性或方法;由调用方传入设备支持的 Oad / Omd 和精确 Data 参数。
from dlt698 import Client, Data, Oad, Omd
def write_parameter(client: Client, attribute: Oad, value: Data) -> None:
dar = client.set(attribute, value)
print("SET DAR", dar)
def invoke_method(client: Client, method: Omd, parameter: Data) -> None:
result = client.action(method, parameter)
print("ACTION DAR", result.dar)
if result.data is not None:
print(result.data.type, result.data.value)
Omd(oi=..., method=..., mode=...) 描述方法,编号和参数按设备约定填写。DAR=0 表示业务成功;非零 DAR 保留原码。库不自动重试 SET/ACTION;超时或取消后的远端执行结果可能未知。权限与方法参数见写参数与执行方法。
查询记录
from dlt698.standard import record_sequences
query = record_sequences(0x5004, 1, 3)
record = client.get_record(query)
if isinstance(record.result, int):
print("记录 DAR", record.result)
else:
print("实际列", record.columns)
for row in record.result:
print([(cell.type, cell.value) for cell in row])
示例查询日冻结序号区间 [1, 3),设备必须提供相应记录。读取使用响应中的实际列,数据保持精确标签;查询模板和选择器见标准记录与能力筛选,业务场景见日冻结、月冻结和事件记录。
发布服务器数据
from dlt698 import Data, Device, Oad, Server
device = Device()
frequency = Oad(oi=0x200F, attribute=2)
device.set(frequency, Data.uint16(5000))
with Server(device) as server:
server.start_tcp("127.0.0.1", 6980)
input("服务器已启动,按 Enter 停止\n")
其他客户端可读取该端口;运行中调用 device.set(...) 或 server.set(...) 更新数据。共享 Device 独立于连接保存数据。本地 set 不授予远端 SET 权限,目录和可写 schema 见对外提供设备数据。
错误与事件
from dlt698 import DarError, Dlt698Error, Oad
try:
value = client.get(Oad(oi=0x200F, attribute=2)).require_data()
except DarError as error:
print("业务拒绝", error.dar)
except Dlt698Error as error:
print(error.code, error.offset, error.context, error.remote_code)
单次 GET 返回 ReadResult,只有显式 require_data() 才将业务 DAR 转为 DarError。连接、协议等本地失败抛 Dlt698Error 子类;超时也属于 TimeoutError。原始诊断字节保存在 context_bytes,错误类别和 DAR 见错误码参考。
同步诊断事件通过 Client(on_event=...) / Server(on_event=...) 接收,再由业务线程调用 dispatch_events() 分发。事件队列有界,超限计入 dropped_events;关闭后停止分发。回调用于观察,不替代业务结果;一个连接同时只允许一个在途请求。