如何用Python实现双线程协同:一边实时收发MODBUS ASCII协议的RS485数据,一边交互式获取用户参数并触发条件响应?

以下是基于您提供的需求书写的Python代码: ```python import threading from time import sleep import serial # 定义全局变量 WW = 0 RR = 0 obj_type = "" address = None data_value = None DD_R_01, DD_R_02, DD_R_03, DD_R_04, DD_R_05, DD_R_06, DD_R_07, DD_R_08, DD_R_09, DD_R_10 = [0] * 10 DD_R_11, DD_R_12, DD_R_13, DD_R_14, DD_R_15, DD_R_16, DD_R_17, DD_R_18, DD_R_19, DD_R_20 = [0] * 10 DD_R_21, DD_R_22, DD_R_23, DD_R_24, DD_R_25, DD_R_26, DD_R_27, DD_R_28, DD_R_29 = [0] * 9 DD_W = 0 PMS_W, PMS_R, XX_W, XX_R, YY_W, YY_R, SS_W, SS_R, MM_W, MM_R = [0] * 10 TT_W, TT_R, CC_W, CC_R, DD_W, DD_R, CN_0_W, CN_0_R, CN_2_W, CN_2_R, TN_W, TN_R = [0] * 12 def set_global_vars(var_name): """设置对应变量为1,并将其余同组变量置零""" global PMS_W, PMS_R, XX_W, XX_R, YY_W, YY_R, SS_W, SS_R, MM_W, MM_R, \ TT_W, TT_R, CC_W, CC_R, DD_W, DD_R, CN_0_W, CN_0_R, CN_2_W, CN_2_R, TN_W, TN_R all_vars = [ 'PMS_W', 'PMS_R', 'XX_W', 'XX_R', 'YY_W', 'YY_R', 'SS_W', 'SS_R', 'MM_W', 'MM_R', 'TT_W', 'TT_R', 'CC_W', 'CC_R', 'DD_W', 'DD_R', 'CN_0_W', 'CN_0_R', 'CN_2_W', 'CN_2_R', 'TN_W', 'TN_R' ] for var in all_vars: globals()[var] = 1 if var == var_name else 0 def user_input_thread(): """用户交互线程:处理用户的输入和主程序部分的功能""" while True: try: # 第一次输入 - 工作状态(W/R) choice = input("请选择工作状态 W 或 R (quit退出): ").strip().upper() if choice.lower() == "quit": print("程序即将退出...") break if choice not in ["W", "R"]: print("无效选项,请重新输入!") continue global WW, RR WW = 1 if choice == "W" else 0 RR = 1 if choice == "R" else 0 # 第二次输入 - 对象类别(P/X/Y/S/M/T/C/D/V/F) obj_choice = input("请选择对象类别 P X Y S M T C D V F: ").strip().upper() global obj_type obj_type = obj_choice.upper() # 特殊情况:如果选择了"D" if obj_choice.strip().upper() == "D": set_global_vars('DD_W') print(f"赋值DD_W=1并打印显示‘星期六’") # 第三次输入 - 地址(十进制) address_val = int(input("请输入地址(十进制数字): ")) global address address = address_val # 第四次输入 - 数据(十进制) data_val = int(input("请输入数据(十进制数字): ")) global data_value data_value = data_val # 主程序运行逻辑 run_main_program() except Exception as e: print(e) def rs485_serial_thread(): """RS485通信线程:负责发送和接收数据""" ser = serial.Serial(port="COM6", baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=0.2) def receive_data(): nonlocal ser received_count = 0 buffer = [] while received_count < 29: raw_data = ser.read_until(expected=b'\r\n') # MODBUS ASCII协议结束符 \r\n decoded_data = raw_data.decode().replace('\r\n', '').lstrip(':').rstrip(' ').strip('0x') if len(decoded_data) > 0 and decoded_data.isdigit(): value = int(decoded_data) buffer.append(value) # 如果接收到特殊数值,则触发对应的事件 if value == 254: print("操作员=A") elif value == 36 and DD_R_01 <= 200: print("盈利富足") received_count += 1 # 输出当前已接收到的所有值 dd_list = ['DD_R_01', 'DD_R_02', 'DD_R_03', 'DD_R_04', 'DD_R_05', 'DD_R_06', 'DD_R_07', 'DD_R_08', 'DD_R_09', 'DD_R_10', 'DD_R_11', 'DD_R_12', 'DD_R_13', 'DD_R_14', 'DD_R_15', 'DD_R_16', 'DD_R_17', 'DD_R_18', 'DD_R_19', 'DD_R_20', 'DD_R_21', 'DD_R_22', 'DD_R_23', 'DD_R_24', 'DD_R_25', 'DD_R_26', 'DD_R_27', 'DD_R_28', 'DD_R_29'] # 更新全局变量 for i, val in enumerate(buffer[:len(dd_list)]): globals()[dd_list[i]] = val # 补充剩余未填充的区域为0 for j in range(len(buffer), 29): globals()[dd_list[j]] = 0 def send_data(): nonlocal ser while True: key_press = input("") if key_press.upper() == "B": # B按键直接显示内容 print(f"WW={WW}, RR={RR}") elif key_press.upper() == "A": # A按键发送固定字符串 command = b"02 45 30 30 34 31 39 30 30 34 03 44 41\r\n" ser.write(command) threads = ( threading.Thread(target=receive_data), threading.Thread(target=send_data) ) for t in threads: t.start() for t in threads: t.join() def run_main_program(): """运行主体程序功能""" global RR, DD_W if RR == 1 and DD_W == 1: print("星期五") if __name__ == "__main__": thread_user_input = threading.Thread(target=user_input_thread) thread_rs485_communication = threading.Thread(target=rs485_serial_thread) thread_user_input.start() thread_rs485_communication.start() thread_user_input.join() thread_rs485_communication.join() ``` ### §相关问题§ 1. 如何修改此程序以便支持更多种类的对象类别? 2. 此程序如何优化以减少CPU占用率? 3. 是否可以在现有基础上加入异常日志记录功能?

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

modbus通信的Python实现

modbus通信的Python实现

Modbus通信是一种广泛应用于工业自动化领域的通信协议,它允许设备之间进行简单且高效的数据交换。在Python中,我们可以使用各种库来实现Modbus通信,其中一个常见的库是`pyModbusTCP`,这也是压缩包文件`...

Python数据分析与应用:从数据获取到可视化

Python数据分析与应用:从数据获取到可视化

Python数据分析与应用是一个涵盖多个领域的综合主题,包括数据获取、数据清洗、数据分析、数据可视化以及相关的编程技巧。在这个领域,Python以其简洁易读的语法和丰富的库支持,成为了数据科学界的首选工具。以下是...

python 上位机实现ModBus协议

python 上位机实现ModBus协议

**Python实现ModBus协议** ModBus是一种广泛应用的通信协议,主要在工业自动化设备中用于数据交换,例如PLC(可编程逻辑控制器)和变频器等。Python作为一门强大且灵活的编程语言,提供了多种库来支持ModBus协议的...

工业通信基于RS485与Modbus协议的软件开发:多节点数据采集系统设计与Python代码实现

工业通信基于RS485与Modbus协议的软件开发:多节点数据采集系统设计与Python代码实现

内容概要:本文系统讲解了RS485通信协议在软件行业特别是工业控制与物联网领域的核心概念与实战开发技术,重点阐述了其差分信号传输、半双工通信、多节点总线结构等特点,并结合Modbus-RTU协议说明数据帧格式与通信...

用Python写的Modbus-TCP/IP客户端

用Python写的Modbus-TCP/IP客户端

标题中的“用Python写的Modbus-TCP/IP客户端”指的是一个使用Python编程语言开发的软件工具,该工具能够作为Modbus协议的TCP/IP客户端,用于与支持Modbus协议的设备进行通信。Modbus是一种广泛应用于工业自动化领域...

Modbus(主站Python实现).zip_modbus python_modbus主站linux_modubs_python

Modbus(主站Python实现).zip_modbus python_modbus主站linux_modubs_python

Python有许多库可以支持Modbus通信,例如`pymodbus`,这是一个完全实现了Modbus协议栈的开源库,包括RTU(远程终端单元)和TCP(传输控制协议)模式。 **pymodbus库** `pymodbus`库提供了丰富的API,允许开发者...

python实现股票行情数据获取

python实现股票行情数据获取

9. **界面设计**:`promana_ui.py`和`Ui_promana.py`可能涉及用户界面设计,可能是使用了`PyQt`或`tkinter`库来创建GUI,允许用户交互式地查看和管理股票数据。 10. **日志记录**:`filelog.py`可能用于日志记录,...

minimalmodbus:适用于 Python 的易于使用的 Modbus RTU 和 Modbus ASCII 实现

minimalmodbus:适用于 Python 的易于使用的 Modbus RTU 和 Modbus ASCII 实现

适用于 Python 的易于使用的 Modbus RTU 和 Modbus ASCII 实现。 网络资源 文档: : GitHub 上的源代码: : 带下载的 Python 包索引 (PyPI): ://pypi.org/project/MinimalModbus/ 其他网页: Readthedocs ...

python_modbus_tk_linux

python_modbus_tk_linux

标题“python_modbus_tk_linux”表明这是一个关于在Linux操作系统中使用Python的Modbus库——`modbus-tk`进行通信的项目。`modbus-tk`是Python的一个开源库,用于实现Modbus协议,该协议广泛应用于工业自动化设备间...

基于Python实现PLC数据采集与多协议转换(OPC UA、MQTT、Modbus)

基于Python实现PLC数据采集与多协议转换(OPC UA、MQTT、Modbus)

内容概要:本文详细介绍了如何利用Python将工厂车间内的PLC数据进行采集并实现从Modbus到MQTT再到OPC UA的协议转换。首先,通过pymodbus库读取PLC的Modbus数据,处理数据后,使用paho-mqtt库将其发布到MQTT服务器。...

Python 实现 UDS (ISO-14229) 源码

Python 实现 UDS (ISO-14229) 源码

下面将详细介绍UDS协议、Python在UDS中的应用以及如何使用python-udsoncan库。 **UDS协议详解:** UDS是汽车诊断协议的标准化框架,旨在确保不同制造商的诊断设备和服务能够互操作。UDS协议定义了一套服务,如读取...

台达VFD-M变频器电脑串口通讯调试指南:硬件连接、Modbus RTU协议及Python代码实现

台达VFD-M变频器电脑串口通讯调试指南:硬件连接、Modbus RTU协议及Python代码实现

控制效果预期(正反转、停止、频率设定及运行数据读取),串口通讯基础知识(串口通讯和Modbus RTU协议),实操步骤(硬件连接、选择串口调试软件、编写并发送控制指令),以及测试方法(基本功能测试、数据读取测试...

python实时读取串口数据并自动保存至excel

python实时读取串口数据并自动保存至excel

在本项目中,我们使用Python来实现实时读取串口数据,并利用多线程技术将这些数据自动保存到Excel文件中。此外,该项目还提供了可扩展性,可以集成PyQT5图形用户界面(GUI)来增强用户体验。 首先,让我们深入了解...

Python编程实现USB转RS485串口通信.rar

Python编程实现USB转RS485串口通信.rar

在Python代码中,可以使用`serial.Serial()`函数来创建一个串口对象,传入端口号(通常是像"/dev/ttyUSB0"这样的设备路径)和其他配置参数,如波特率、数据位、停止位和校验位。例如: ```python import serial ser...

STM32F103C8T6 MODBUSSlave 和 Python GUI显示

STM32F103C8T6 MODBUSSlave 和 Python GUI显示

在这个项目中,我们将关注它如何与Modbus协议配合工作,以及如何通过Python进行数据交互并构建GUI界面。 Modbus是一种通用的工业通信协议,最初由Modicon公司开发,现已成为一种开放标准,尤其适用于PLC(可编程...

python爬虫: 1、记录捕获各网站的数据 2、逆向JS(请求数据加密、响应数据解密)

python爬虫: 1、记录捕获各网站的数据 2、逆向JS(请求数据加密、响应数据解密)

Python爬虫技术是数据获取的重要工具,特别是在大数据时代,它能帮助我们自动化地从网络上收集和处理信息。本主题将深入探讨两个关键方面:如何记录捕获各网站的数据以及如何逆向工程JavaScript以处理加密的请求和...

基于Python的ModbusTCP客户端实现详解

基于Python的ModbusTCP客户端实现详解

Modbus Poll和Modbus Slave是两款非常流行的Modbus设备仿真软件,支持Modbus RTU/ASCII和Modbus TCP/IP协议 ,经常用于测试和调试Modbus设备,观察Modbus通信过程中的各种报文。 当用于支持Modbus RTU/ASCII协议时,...

Python中实现Modbus协议-可以使用pymodbus

Python中实现Modbus协议-可以使用pymodbus

使用pymodbus库实现的通信模块可以与市面上绝大多数支持Modbus协议的设备进行交互。无论是在构建自动化的工业控制系统,还是在开发智能仪表的读取程序,pymodbus库都能够提供稳定的解决方案。 对于开发者而言,...

Python-ModBusRTU:轮询和存储 ModBus RTU 数据的脚本

Python-ModBusRTU:轮询和存储 ModBus RTU 数据的脚本

不太重要的注意事项:这些说明是为不使用 github 的人编写的重要的提示: 注意:在进行维护/重新配置时...运行“modbus-stop.py”。 您可以从文件夹视图中双击它。 注意 2:完成维护或配置后,运行“modbus-start.py...

Python中实现ModbusRTU协议-使用pymodbus

Python中实现ModbusRTU协议-使用pymodbus

在当今工业自动化领域,Modbus协议是极为普遍的通信协议,尤其Modbus RTU模式,因其高效率和稳定的串行通信特性,在工业控制和监测系统中得到了广泛的应用。Python作为一款功能强大的编程语言,通过pymodbus库,可以...

最新推荐最新推荐

recommend-type

Java与Python之间使用jython工具类实现数据交互

Java与Python之间使用jython工具类实现数据交互 Java与Python之间的数据交互是当前大数据时代中非常重要的一方面,特别是在数据科学和人工智能领域中。 Java和Python都是非常popular的编程语言, Java作为强大的...
recommend-type

利用Python实现Excel的文件间的数据匹配功能

在Python编程中,处理Excel文件是一项常见的任务,特别是在数据分析和数据处理领域。本文将深入探讨如何利用Python实现Excel文件间的数据匹配功能。首先,我们需要了解Excel中的MATCH函数,这是一个用于查找特定值在...
recommend-type

Python数据分析基础:异常值检测和处理

Python中,我们可以利用pandas的`describe()`函数获取数据的统计描述,或者使用散点图直观地识别异常值。此外,还可以使用numpy的`percentile`方法和seaborn的`boxplot`函数来实现箱型图的绘制,进一步帮助识别异常...
recommend-type

python使用pyecharts库画地图数据可视化的实现

本文将详细介绍如何使用Pyecharts库来实现地图数据可视化。 首先,我们需要导入必要的库。在Python中,`pyecharts`是我们的主要库,它提供了丰富的图表类型,包括地图。以下是如何导入这个库: ```python from ...
recommend-type

python使用threading获取线程函数返回值的实现方法

然而,Python的`threading`模块本身并不直接支持获取线程函数的返回值,这需要我们通过一些额外的方式来实现。以下将详细解释如何在Python中使用`threading`获取线程函数的返回值。 首先,我们需要理解`threading`...
recommend-type

构建智慧警务大数据平台:全面技术架构设计解析

资源摘要信息:智慧警务大数据平台 本方案文档是关于构建一个智慧警务大数据平台的总体设计方案。该平台旨在利用大数据技术提升警务工作的效率和质量,通过集成、分析、存储和处理海量数据,实现对各种警务信息的即时处理与智能化决策支持。 1. 平台技术方案 技术方案部分概述了整个智慧警务大数据平台的技术选型、技术路线以及构建该平台所需的各项技术细节,包括但不限于数据采集、存储、处理和分析等环节。 2. 项目概述 项目概述部分通常会介绍智慧警务大数据平台的建设背景、目标和意义。它涉及到利用大数据技术对警务信息进行有效管理,提高应对各类犯罪和公共安全问题的响应速度和处理能力。 3. 项目需求 项目需求部分详细描述了智慧警务平台所应满足的功能需求和性能需求,包括数据的实时接入、处理、分析与展示等方面的需求,以及为满足不同业务场景所设计的特定功能需求。 4. 项目架构设计 项目架构设计部分是对智慧警务大数据平台整体架构的详细规划。这包括数据层、服务层和应用层等多个层面的架构设计,以及它们之间的数据流和交互方式。 5. 计算资源池设计方案 计算资源池设计方案部分着重于平台所需计算资源的规划,包括服务器硬件的选择、网络配置、虚拟化技术的应用等内容,以确保平台具有足够的计算能力和弹性。 6. 大数据处理设备设计方案 大数据处理设备设计方案部分着重介绍用于数据处理的硬件和软件工具的选择和配置,例如分布式计算框架、实时数据处理系统、复杂事件处理(CEP)技术等。 7. 存储资源池设计方案 存储资源池设计方案部分涉及数据存储方案的规划,包括选择合适的存储技术(如Hadoop分布式文件系统HDFS、对象存储等),以及保障数据安全和备份恢复机制的设计。 8. 业务系统搬迁方案 业务系统搬迁方案部分针对现有业务系统的迁移提出了详细的计划和步骤,包括对现有系统的评估、迁移策略制定、数据迁移过程中的数据一致性和完整性保障措施。 9. 数据迁移技术方案 数据迁移技术方案部分提供了从旧系统向新平台迁移数据的技术细节。这通常包括数据抽取、转换、加载(ETL)过程的设计和实施,以确保数据在迁移过程中的准确性和完整性。 以上各部分共同构成了智慧警务大数据平台的总体设计方案。通过综合运用各种大数据技术和计算资源管理策略,该平台能够有效支持警务部门在犯罪预防、案件侦破、交通管理、社区警务等多方面的智能化决策,助力提升整体的警务工作效能和社区安全水平。
recommend-type

保姆级教程:用Wireshark抓包分析DoIP协议(从车辆发现到诊断通信)

# 实战指南:Wireshark深度解析DoIP协议全流程 最近在车载诊断领域,DoIP协议凭借其高速率、远距离通信的优势逐渐成为行业新宠。但纸上得来终觉浅,真正理解协议细节还得靠实战抓包。本文将带您从零开始,用Wireshark完整捕获并分析DoIP通信的每个关键环节,包括车辆发现、TCP连接建立、路由激活和诊断消息传输。无论您是刚入行的汽车网络工程师,还是想拓展技能栈的嵌入式开发者,这套保姆级教程都能让您获得第一手的协议分析经验。 ## 1. 实验环境搭建与基础配置 在开始抓包前,我们需要搭建一个接近真实场景的测试环境。推荐使用以下硬件组合: - **诊断设备**:安装有Wiresh
recommend-type

CAPWAP隧道是怎么在AP和AC之间建立并传输数据的?

### CAPWAP隧道协议原理及作用 #### CAPWAP隧道概述 CAPWAP(Control And Provisioning of Wireless Access Points)是一种用于无线网络中的应用层协议,主要用于实现接入点(AP)与控制器(AC)之间的通信。该协议定义了两种主要的操作模式:集中转发模式和本地转发模式。 #### 隧道建立过程 当AP启动并与AC首次交互时,会根据指定的IP地址发起连接请求并接收来自AC的响应消息[^1]。在此过程中,双方协商参数以决定是否启用DTLS加密机制保护UDP报文的安全性。一旦成功完成握手流程,则正式建立起一条安全可靠的CAPWAP
recommend-type

2020年互联网大厂薪资职级深度解析

资源摘要信息: "2020年互联网大厂薪资和职级一览表详细解析" 在深入分析2020年互联网大厂薪资和职级的情况前,首先要了解这份文档的结构和背景。文档标题“2020互联网大厂的薪资和职级一览(1).pdf”表明其内容是聚焦于2020年知名互联网公司(俗称大厂)的薪资以及员工职级的详细信息。文档描述没有提供额外信息,但标签“计算机”提示我们,内容可能主要与计算机科学或相关信息技术行业相关。 从提供的部分文档内容来看,文件包含了不同职级的代号、薪资范围、绩效评估(KPI)以及一些可能与职级相关的具体数字。在互联网公司中,职级系统和薪酬结构往往是复杂的,并且会随着公司的不同而有所差异。 首先,文档中出现的“HR9”、“P”、“M”、“T”、“S”等字母,很可能是代表不同类型的职级,或者是公司内部对于特定层级的员工的简称。例如,“P”可能代表了产品部门的职级,“M”可能指管理职级,“T”可能与技术岗位相关,而“S”则可能是销售或支持类岗位的职级。 接着,职级后面的数字,如“P1”到“P14”,很可能是按从低到高的顺序排列的职级编号,这有助于区分不同经验和技术水平的员工。数字的范围越宽,通常意味着这一职级对应的薪资和责任范围也更广。 文档中出现的薪资数字,如“30-60W”、“60w-100w”等,表示的是年薪范围。显然,这些数字通常和员工的职级、经验和所在岗位的市场需求紧密相关。 绩效考核(KPI)在文档中被多次提及,这意味着员工的薪资可能与其工作绩效密切相关。文档中“3.75* KPI”可能表示绩效考核结果会被乘以一个系数以影响最终薪资。此外,“3-6-1”格式的数字可能代表某种评分制度或是绩效评估的周期。 在“HRG”、“MM”、“OKR+360OKR”等字样中,可以推测这与人力资源管理相关。HRG可能是公司内部人力资源小组(Human Resources Group)的简称,“MM”可能指的是绩效评估周期,而“OKR”代表目标与关键结果(Objectives and Key Results),这是一种流行的绩效管理系统,而“360OKR”则可能是指一种360度的绩效反馈机制。 此外,“title”一词在文档中多次出现,表明职级系统中每个等级都有对应的职位头衔。例如,“T3-3”和“T4-1”中的数字可能代表了特定的职位级别,而“T7”、“T10”、“T11”等则进一步划分了更细化的等级。 文档中也提到了“base”和“package”,通常指的是员工的基础薪资和包含所有福利、奖金在内的总包薪资。这对于理解员工的总收入非常关键。 最后,互联网公司常用一些特定的算法来计算薪资和奖金,例如文档中的“12019 3 31 5.4626”可能是一个日期或算法相关的数字,而“12+1+3=16”这样的数学式可能用于解释薪资计算过程中的某些参数或规则。 整体来看,文档中所提到的职级系统、薪资结构、绩效考核和奖金计算是互联网公司员工最为关注的几个方面。对于想要了解互联网行业薪酬和职级情况的人来说,这份文档提供了丰富的一手资料。不过,由于缺乏上下文和全面的描述,本解析只能作为初步的了解,更深入的分析需要更多完整的信息。
recommend-type

3分钟搞懂dB/dBm/dBV区别:从放大器增益到噪声测量的完整对照表

# 3分钟搞懂dB/dBm/dBV区别:从放大器增益到噪声测量的完整对照表 在电子工程和通信领域,分贝(dB)概念无处不在,但初学者常常被各种衍生单位搞得晕头转向。想象一下,当你看到设备规格书上写着"输出功率13dBm"、"信噪比60dB"、"电压增益20dB"时,是否曾疑惑它们之间有何区别?本文将用生活化的类比和直观对照表,帮你彻底理清这些概念。 ## 1. 分贝(dB)的本质:相对值的语言 分贝本质上是一种对数比例单位,用来表示两个量之间的比值关系。它的核心优势在于能够将极大范围的数值压缩到易于处理的小范围内。举个例子,人类听觉从最小可听到最痛阈值的声压比约为1:1,000,000,