src package
Subpackages
- src.common package
- src.model package
- src.protocol package
- Submodules
- src.protocol.frame module
- src.protocol.log module
- src.protocol.protocol module
DLT645ProtocolDLT645Protocol.MAX_DATA_LENGTHDLT645Protocol.MAX_PREAMBLE_LENGTHDLT645Protocol.MIN_FRAME_LENGTHDLT645Protocol.decode_data()DLT645Protocol.encode_data()DLT645Protocol.calculate_checksum()DLT645Protocol.build_frame()DLT645Protocol.deserialize()DLT645Protocol.deserialize_with_remaining()DLT645Protocol.serialize()
- Module contents
- src.service package
- src.transport package
Module contents
DLT645协议Python实现库
这个库提供了DLT645通信协议的完整实现,包括: - TCP和RTU通信方式 - 客户端和服务端功能 - 电能表数据读写操作 - 电能量、最大需量、变量数据类型支持 - 实时报文捕获功能
- src.configure_logging(enabled=True, cmdlevel=None, filelevel=None, filename=<object object>, backup_count=None, limit=None, when=None, colorful=None, compression=None, is_backtrace=None)[源代码]
配置 dlt645 库的日志输出。
库默认**不输出任何日志**;调用本函数启用日志或调整日志配置。
- 参数:
enabled (bool) -- True 启用日志输出,False 关闭(移除所有日志 handler)。
cmdlevel (Optional[str]) -- 控制台日志级别(如 "DEBUG"/"INFO"/"WARNING"/"ERROR")。 None 表示回退到各模块默认级别。
filelevel (Optional[str]) -- 文件日志级别。None 表示回退到各模块默认级别。
filename (Union[str, None, object]) -- 统一日志文件路径;指定后所有模块日志输出到该文件。 传 None 恢复"各模块各自文件";不传(默认)保持当前配置。
backup_count (Optional[int]) -- 日志文件保留数量(天)。
when (Optional[str]) -- 按时间轮转(如 "midnight"、"D"、"H")。
colorful (Optional[bool]) -- 控制台输出是否带颜色。
compression (Optional[str]) -- 轮转文件压缩格式(如 "zip")。
is_backtrace (Optional[bool]) -- 是否显示调用位置(文件:函数:行号)。
- 返回类型:
示例:
from dlt645 import configure_logging # 启用日志,控制台 INFO、文件 DEBUG configure_logging(cmdlevel="INFO", filelevel="DEBUG") # 所有日志统一写入指定文件 configure_logging(filename="logs/meter.log") # 恢复各模块各自文件 configure_logging(filename=None) # 关闭日志 configure_logging(enabled=False)
- src.enable_logging(**kwargs)[源代码]
启用 dlt645 库日志输出(可传
configure_logging()的参数)。- 返回类型:
- class src.MeterServerService(server, address=None, password_manager=None)[源代码]
基类:
object电表服务端服务类。
用于模拟 DLT645 电表设备,响应客户端的数据读写请求。
- 变量:
server -- 通信服务器(TCP 或 RTU)。
address -- 设备地址(6字节)。
password_manager -- 密码管理器。
clear_meter_event_records -- 电表清零事件记录列表。
event_records -- 事件记录列表。
初始化电表服务端服务。
- 参数:
server (Union[TcpServer, RtuServer]) -- 通信服务器实例(TcpServer 或 RtuServer)。
address (Optional[bytearray]) -- 设备地址,默认为全零。
password_manager (Optional[PasswordManager]) -- 密码管理器,默认创建新实例。
- classmethod new_meter_server_service(server)[源代码]
创建新的MeterServerService实例
- 参数:
- 返回类型:
- 返回:
MeterServerService实例
- set_time(data_bytes)[源代码]
广播校时:解析 YYMMDDhhmmss 并设置表内时钟。
按 DL/T645-2007 第6节:广播校时数据域为 6 字节压缩 BCD 码, 依次为年(后两位)、月、日、时、分、秒(自然顺序)。
- 参数:
data_bytes (bytearray) -- 数据域(6字节)。
- get_captured_messages(count=0)[源代码]
获取捕获的报文列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
报文列表
- 返回类型:
List[MessageRecord]
- get_captured_tx_messages(count=0)[源代码]
获取捕获的发送报文列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
发送报文列表
- 返回类型:
List[MessageRecord]
- get_captured_rx_messages(count=0)[源代码]
获取捕获的接收报文列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
接收报文列表
- 返回类型:
List[MessageRecord]
- get_captured_pairs(count=0)[源代码]
获取捕获的TX/RX配对列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
配对列表
- 返回类型:
List[MessagePair]
- class src.MeterClientService(client)[源代码]
基类:
object电表客户端服务类。
用于与 DLT645 电表设备进行通信,提供数据读写等业务功能。
- 变量:
address -- 设备地址(6字节)。
password_manager -- 密码管理器。
operation_code -- 操作码(4字节)。
client -- 通信客户端(TCP 或 RTU)。
初始化电表客户端服务。
- classmethod new_rtu_client(port, baudrate, databits, stopbits, parity, timeout)[源代码]
创建RTU客户端
- 返回类型:
- broadcast_time_sync(dt=None)[源代码]
广播校时命令(C=08H,数据域YYMMDDhhmmss)。
按 DL/T645-2007 第6节:广播校时使用广播地址 999999999999H, 数据域为 6 字节压缩 BCD 码(YY MM DD hh mm ss,自然顺序), 从站不要求应答,因此只发送不等待响应。
- 参数:
dt (Optional[datetime]) -- 校时时间,默认当前时间。
- 返回:
发送成功返回 True,失败返回 False。
- 返回类型:
- freeze(month=None, day=None, hour=None, minute=None, broadcast=False)[源代码]
冻结命令(C=16H,数据域MMDDhhmm)。
按 DL/T645-2007 第7节:数据域为 4 字节压缩 BCD 码(MM DD hh mm), 各字段缺省时取当前时间;可传 99 表示周期定时冻结: - 99DDhhmm:以月为周期定时冻结 - 9999hhmm:以日为周期定时冻结 - 999999mm:以小时为周期定时冻结 - 99999999:瞬时冻结
- change_baud_rate(baud)[源代码]
更改通信速率命令(C=17H,数据域1字节通信速率特征字)。
按 DL/T645-2007 第8节:数据域为 1 字节特征字(见附录C), 从站正常应答帧中的数据与请求帧中的特征字必须相同。 标准速率:1200/2400/4800/9600/19200 bps。
- clear_demand(di, password)[源代码]
最大需量清零命令(C=19H,数据域DI+密码)。
按 DL/T645-2007 第10节:数据域为 4 字节数据标识 + 4 字节密码, 将当前最大需量及发生时间数据清零。需 04 级及以上权限。
- clear_meter(password)[源代码]
电表清零命令(C=1AH,数据域DI+密码)。
按 DL/T645-2007 第11节:数据域为 4 字节数据标识(00000000H) + 4 字节密码,清空电能量、最大需量及发生时间、冻结量、 事件记录、负荷记录等数据(电表清零事件记录不被清除)。
- clear_event(password, operator_code='00000000', di=4294967295)[源代码]
事件清零命令(C=1BH,数据域密码+操作者代码+数据标识)。
按 DL/T645-2007 第12节:数据域为 4 字节密码 + 4 字节操作者代码 + 4 字节数据标识。数据标识为 FFFFFFFFH 表示事件总清零; 分项事件清零时数据标识为事件记录数据标识(DI0 用 FF 表示)。
- send_and_handle_request(frame_bytes)[源代码]
发送请求并处理响应(带超时控制)
- Args:
frame_bytes: 要发送的帧数据
- Returns:
DataItem: 成功时返回数据项 None: 超时或失败时返回
- get_captured_messages(count=0)[源代码]
获取捕获的报文列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
报文列表
- 返回类型:
List[MessageRecord]
- get_captured_tx_messages(count=0)[源代码]
获取捕获的发送报文列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
发送报文列表
- 返回类型:
List[MessageRecord]
- get_captured_rx_messages(count=0)[源代码]
获取捕获的接收报文列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
接收报文列表
- 返回类型:
List[MessageRecord]
- get_captured_pairs(count=0)[源代码]
获取捕获的TX/RX配对列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
配对列表
- 返回类型:
List[MessagePair]
- class src.DLT645Protocol[源代码]
基类:
object无状态的 DL/T 645 帧编解码器。
- MAX_DATA_LENGTH = 255
- MAX_PREAMBLE_LENGTH = 4
- MIN_FRAME_LENGTH = 12
- class src.CtrlCode(value)[源代码]
基类:
IntEnum控制码枚举。
DLT645 协议中控制码用于标识帧的功能类型,取值遵循 DL/T645-2007 标准。
- 变量:
BroadcastTimeSync -- 广播校时命令(0x08)
ReadData -- 读数据命令(0x11)
ReadAddress -- 读通讯地址命令(0x13)
WriteData -- 写数据命令(0x14)
WriteAddress -- 写通讯地址命令(0x15)
FreezeCmd -- 冻结命令(0x16)
ChangeBaudRate -- 修改通信速率命令(0x17)
ChangePassword -- 修改密码命令(0x18)
ClearDemand -- 最大需量清零命令(0x19)
ClearMeter -- 电表清零命令(0x1A)
ClearEvent -- 事件清零命令(0x1B)
- BroadcastTimeSync = 8
- ReadData = 17
- ReadAddress = 19
- WriteData = 20
- WriteAddress = 21
- FreezeCmd = 22
- ChangeBaudRate = 23
- ChangePassword = 24
- ClearDemand = 25
- ClearMeter = 26
- ClearEvent = 27
- class src.Demand(value, time)[源代码]
基类:
object需量数据类。
用于表示最大需量及其发生时间。
- 变量:
value -- 需量值(单位由具体数据项定义)。
time -- 需量发生时间。
初始化 Demand 实例。
- 参数:
value (float) -- 需量值。
time (datetime) -- 需量发生时间。
- class src.DataItem(di, name, data_format, value=0, unit='', update_time=None)[源代码]
基类:
object数据项实体类,表示一个具体的数据项。
- 变量:
di -- 数据标识 (DI),4 字节。
name -- 数据项名称。
data_format -- 数据格式字符串(如 "XXXXXX.XX")。
value -- 数据值。
unit -- 数据单位。
update_time -- 最后更新时间戳。
初始化 DataItem 实例。
- class src.DataFormat(value)[源代码]
基类:
Enum表示各种数据格式模板的枚举。
定义说明: - X: 十进制数字 - Y: 年 - M: 月 - D: 日 - W: 星期 - h: 时 - m: 分 - s: 秒 - N: 数字(通用)
- XXXXXXXX = 'XXXXXXXX'
- XXXXXX_XX = 'XXXXXX.XX'
- XXXX_XX = 'XXXX.XX'
- XXX_XXX = 'XXX.XXX'
- XX_XXXX = 'XX.XXXX'
- XXX_X = 'XXX.X'
- X_XXX = 'X.XXX'
- YYMMDDWW = 'YYMMDDWW'
- hhmmss = 'hhmmss'
- YYMMDDhhmm = 'YYMMDDhhmm'
- NN = 'NN'
- NNNN = 'NNNN'
- NNNNNNNN = 'NNNNNNNN'
- class src.TcpServer(ip, port, timeout=5.0, service=None)[源代码]
基类:
object为每条 TCP 连接创建一个工作线程的服务端。
- MAX_BUFFER_SIZE = 4096
- class src.RtuServer(port, data_bits=8, stop_bits=1, baud_rate=9600, parity='N', timeout=5.0, service=None)[源代码]
基类:
object在后台线程中读取和处理串口帧。
- MAX_BUFFER_SIZE = 4096
- class src.TcpClient(ip='', port=0, timeout=5.0)[源代码]
基类:
object支持分片响应、总超时和串行请求的 TCP 客户端。
- MAX_BUFFER_SIZE = 4096
- class src.RtuClient(port='', baud_rate=9600, data_bits=8, stop_bits=1, parity='N', timeout=1.0)[源代码]
基类:
object支持分片读取、总超时与重试的串口客户端。
- MAX_BUFFER_SIZE = 4096
- class src.MessageRecord(direction, data, id=<factory>, timestamp=<factory>, hex_string='', pair_id=None)[源代码]
基类:
object单条报文记录。
用于存储发送或接收的单条报文数据。
- 变量:
id -- 唯一标识符 (UUID)
direction -- 报文方向,"TX"(发送)或 "RX"(接收)
data -- 原始报文数据
timestamp -- 时间戳(秒,带小数部分)
hex_string -- 十六进制字符串表示
pair_id -- 配对的报文ID,用于TX/RX关联
- class src.MessagePair(id=<factory>, tx=None, rx=None, round_trip_time=None)[源代码]
基类:
objectTX/RX配对记录。
用于将发送报文和接收报文配对,便于分析请求-响应对。
- 变量:
id -- 配对ID
tx -- 发送报文记录
rx -- 接收报文记录
round_trip_time -- 往返时间(秒)
-
tx:
Optional[MessageRecord] = None
-
rx:
Optional[MessageRecord] = None
- set_tx(record)[源代码]
设置发送报文。
- 参数:
record (MessageRecord) -- 发送报文记录
- 返回类型:
- set_rx(record)[源代码]
设置接收报文。
- 参数:
record (MessageRecord) -- 接收报文记录
- 返回类型:
- class src.MessageCapture(enabled=False, queue_size=100)[源代码]
基类:
object报文捕获管理器。
管理TX和RX报文的捕获、配对和存储。 默认禁用,需要显式调用enable()启用。
- 变量:
_enabled -- 是否启用捕获
_queue_size -- 队列大小
_tx_queue -- 发送报文队列
_rx_queue -- 接收报文队列
_pairs -- 配对队列
_pending_pairs -- 等待配对的记录(TX等待RX)
初始化报文捕获管理器。
- get_tx_messages(count=0)[源代码]
获取发送报文列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
发送报文列表
- 返回类型:
List[MessageRecord]
- get_rx_messages(count=0)[源代码]
获取接收报文列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
接收报文列表
- 返回类型:
List[MessageRecord]
- get_pairs(count=0)[源代码]
获取配对列表。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
配对列表
- 返回类型:
List[MessagePair]
- get_all_messages(count=0)[源代码]
获取所有报文(TX和RX),按时间排序。
- 参数:
count (int) -- 要获取的数量,0表示全部
- 返回:
所有报文列表
- 返回类型:
List[MessageRecord]