调试更改+挡板电机添加线程和配置文件
This commit is contained in:
@ -161,10 +161,29 @@ class RTUSerialHandle:
|
||||
else:
|
||||
return unsigned_value
|
||||
|
||||
def uint32_to_int32(self, unsigned_value: int) -> int:
|
||||
"""
|
||||
将32位无符号十进制数转换为32位有符号十进制数
|
||||
:param unsigned_value: 无符号十进制数
|
||||
:return: 有符号十进制数
|
||||
"""
|
||||
# 先校验输入范围(必须是32位无符号数)
|
||||
if not isinstance(unsigned_value, int):
|
||||
raise ValueError(f"输入必须是整数,当前是{type(unsigned_value)}")
|
||||
if unsigned_value < 0 or unsigned_value > 4294967295:
|
||||
raise ValueError(f"输入必须是0~4294967295的整数,当前是{unsigned_value}")
|
||||
|
||||
# 核心转换逻辑
|
||||
if unsigned_value > 2147483647: # 0x7FFFFFFF
|
||||
return unsigned_value - 4294967296 # 0x100000000
|
||||
else:
|
||||
return unsigned_value
|
||||
|
||||
def __del__(self):
|
||||
"""析构函数,程序退出时自动关闭串口,防止资源泄露"""
|
||||
self.close()
|
||||
|
||||
|
||||
# -------对外接口--------
|
||||
# public
|
||||
def open_serial_port(port: str, baudrate: int, databits: int, stopbits: int, parity: int) -> Optional[int]:
|
||||
@ -223,6 +242,7 @@ def open_serial_port(port: str, baudrate: int, databits: int, stopbits: int, par
|
||||
print(f"串口[{port}]打开成功,句柄ID:{handle_id}")
|
||||
return handle_id
|
||||
|
||||
|
||||
def close_serial_port(handle: int):
|
||||
"""
|
||||
关闭Modbus串口
|
||||
@ -245,6 +265,7 @@ def close_serial_port(handle: int):
|
||||
|
||||
print(f"句柄{handle}(串口[{handle_obj.port}])已关闭")
|
||||
|
||||
|
||||
# --------Modbus RTU CRC16校验函数-----------
|
||||
def modbus_crc16(data: bytes) -> bytes:
|
||||
"""
|
||||
@ -269,6 +290,7 @@ def modbus_crc16(data: bytes) -> bytes:
|
||||
# 把16位CRC值拆成2个字节(小端序:低字节在前,高字节在后)
|
||||
return bytes([crc & 0xFF, (crc >> 8) & 0xFF])
|
||||
|
||||
|
||||
def verify_modbus_crc(data: bytes) -> bool:
|
||||
"""
|
||||
验证Modbus RTU数据的CRC16校验码
|
||||
@ -411,6 +433,7 @@ def read_holding_register(handle: int, station_addr: int, start_reg_addr: int,
|
||||
print(f"读寄存器成功 | 从站{station_addr} | 起始地址{start_reg_addr} | 数量{reg_count} | 数据:{out_buffer}")
|
||||
return out_buffer
|
||||
|
||||
|
||||
def write_single_register(handle: int, station_addr: int, reg_addr: int, write_value: int,
|
||||
resp_offset: int, use_crc: int) -> int:
|
||||
"""
|
||||
@ -498,9 +521,10 @@ def write_single_register(handle: int, station_addr: int, reg_addr: int, write_v
|
||||
print(f"写响应不匹配 | 请求:{expected_resp.hex(' ')} | 响应:{response.hex(' ')}")
|
||||
return ModbusError.MODBUS_ERR_RESPONSE
|
||||
|
||||
print(f"写单个寄存器成功 | 从站{station_addr} | 地址{reg_addr} | 值{write_value}")
|
||||
# print(f"写单个寄存器成功 | 从站{station_addr} | 地址{reg_addr} | 值{write_value}")
|
||||
return ModbusError.MODBUS_SUCCESS
|
||||
|
||||
|
||||
def write_multi_register(handle: int, station_addr: int, start_reg_addr: int, reg_count: int,
|
||||
write_values: list[int], resp_offset: int, use_crc: int) -> int:
|
||||
"""
|
||||
@ -620,6 +644,7 @@ def write_multi_register(handle: int, station_addr: int, start_reg_addr: int, re
|
||||
print(f"批量写寄存器成功 | 从站{station_addr} | 起始地址{start_reg_addr} | 数量{reg_count} | 值:{write_values}")
|
||||
return ModbusError.MODBUS_SUCCESS
|
||||
|
||||
|
||||
# ---------测试接口--------
|
||||
if __name__ == '__main__':
|
||||
# handle1 = open_serial_port(
|
||||
|
||||
Reference in New Issue
Block a user