You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
4.7 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import struct
from typing import Tuple
from . import tools
def read_unique_identifier(address: bytes) -> bytes:
return tools.pack_command(address, command_id=0)
def read_primary_variable(address: bytes) -> bytes:
return tools.pack_command(address, command_id=1)
def read_loop_current_and_percent(address: bytes) -> bytes:
return tools.pack_command(address, command_id=2)
def read_dynamic_variables_and_loop_current(address: bytes) -> bytes:
return tools.pack_command(address, command_id=3)
def write_polling_address(address: bytes, new_polling_address: int) -> bytes:
assert 0 <= new_polling_address <= 63
return tools.pack_command(address, command_id=6, data=new_polling_address.to_bytes(1, "big"))
def read_unique_identifier_associated_with_tag(tag: bytes, *, address: int = 0) -> bytes:
return tools.pack_command(address, command_id=11, data=tag)
def read_message(address: bytes) -> bytes:
return tools.pack_command(address, command_id=12)
def read_tag_descriptor_date(address: bytes) -> bytes:
return tools.pack_command(address, command_id=13)
def read_primary_variable_information(address: bytes) -> bytes:
return tools.pack_command(address, command_id=14)
def read_output_information(address: bytes) -> bytes:
return tools.pack_command(address, command_id=15)
def read_final_assembly_number(address: bytes) -> bytes:
return tools.pack_command(address, command_id=16)
def write_message(address: bytes, message: str) -> bytes:
"""Writes a 24-char message to the device (Command 17)."""
# Per spec, message is 24 characters, packed into 18 bytes.
packed_message = tools.pack_packed_ascii(message, expected_len=32)
return tools.pack_command(address, command_id=17, data=packed_message)
def write_tag_descriptor_date(address: bytes, tag: str, descriptor: str, date: Tuple[int, int, int]):
"""Writes tag, descriptor, and date to the device (Command 18)."""
# Per spec, tag is 6 chars, descriptor is 12 chars.
packed_tag = tools.pack_packed_ascii(tag, 8)
packed_descriptor = tools.pack_packed_ascii(descriptor, 16)
data = packed_tag + packed_descriptor
day, month, year = date
data += day.to_bytes(1, "big")
data += month.to_bytes(1, "big")
data += year.to_bytes(1, "big")
# print(len(data))
return tools.pack_command(address, command_id=18, data=data)
def write_final_assembly_number(address: bytes, number: int):
data = number.to_bytes(3, "big")
return tools.pack_command(address, command_id=19, data=data)
def write_primary_variable_damping(address: bytes, damping_time: float) -> bytes:
"""修改主变量阻尼时间单位s command 34"""
data = struct.pack(">f", damping_time)
return tools.pack_command(address, command_id=34, data=data)
def write_primary_variable_range(address: bytes, units_code: int, upper_range: float, lower_range: float) -> bytes:
"""修改主变量量程范围 command 35"""
data = units_code.to_bytes(1, "big")
data += struct.pack(">ff", upper_range, lower_range)
return tools.pack_command(address, command_id=35, data=data)
def calibrate_20ma(address: bytes) -> bytes:
"""20mA校准 command 36"""
return tools.pack_command(address, command_id=36)
def calibrate_4ma(address: bytes) -> bytes:
"""4mA校准 command 37"""
return tools.pack_command(address, command_id=37)
def set_fixed_current_output(address: bytes, enable: bool, current_value: float = 0.0) -> bytes:
"""设置固定电流输出/退出固定模式 command 40"""
if enable:
data = struct.pack(">f", current_value)
else:
data = struct.pack(">f", 0)
return tools.pack_command(address, command_id=40, data=data)
def calibrate_zero_point(address: bytes) -> bytes:
"""零点校准 command 43"""
return tools.pack_command(address, command_id=43)
def write_primary_variable_units(address: bytes, units_code: int) -> bytes:
"""修改主变量单位 command 44"""
data = units_code.to_bytes(1, "big")
return tools.pack_command(address, command_id=44, data=data)
def trim_loop_current_4ma(address: bytes, measured_current: float) -> bytes:
"""微调环路电流4mA command 45"""
data = struct.pack(">f", measured_current)
return tools.pack_command(address, command_id=45, data=data)
def trim_loop_current_20ma(address: bytes, measured_current: float) -> bytes:
"""微调环路电流20mA command 46"""
data = struct.pack(">f", measured_current)
return tools.pack_command(address, command_id=46, data=data)
def write_primary_variable_output_function(address: bytes, transfer_function_code: int) -> bytes:
"""修改主变量输出函数 command 47"""
data = transfer_function_code.to_bytes(1, "big")
return tools.pack_command(address, command_id=47, data=data)