当前位置: 首页 > news >正文

python实现ModBusTCP协议的server

python实现ModBusTCP协议的server是一件简单的事情,只要通过pymodbus、pyModbusTCP等模块都可以实现,本文采用pymodbus。

相关文章见:

python实现ModBusTCP协议的client-CSDN博客

一、了解pymodbus的Server

1、pymodbus.server的模块

pymodbus.server中的模块,能够用于用于实现 Modbus 协议的服务器端。以下是每个模块的功能介绍:

(1)ModbusSerialServer: 这个模块提供了一个基于串口的 Modbus 服务器。它允许通过串口与 Modbus 客户端通信。

(2)ModbusTcpServer: 这个模块提供了一个基于 TCP/IP 的 Modbus 服务器。它通过 TCP/IP 网络接口与 Modbus 客户端通信。

(3)ModbusTlsServer: 这个模块提供了一个基于 TLS 加密的 Modbus 服务器。它通过安全的 TLS 连接与 Modbus 客户端通信,确保通信的安全性。

(4)ModbusUdpServer: 这个模块提供了一个基于 UDP 的 Modbus 服务器。与 TCP 不同,UDP 是一种面向无连接的协议,适用于某些特定的网络环境。

(5)ServerAsyncStop: 这个类用于异步服务器的停止信号。通过发送这个信号,可以优雅地停止异步服务器的运行。

(6)ServerStop: 这个类用于同步服务器的停止信号。与 ServerAsyncStop 类似,但用于同步服务器。

(7)StartAsyncSerialServer: 这个函数用于启动一个异步的基于串口的 Modbus 服务器。

(8)StartAsyncTcpServer: 这个函数用于启动一个异步的基于 TCP/IP 的 Modbus 服务器。

(9)StartAsyncTlsServer: 这个函数用于启动一个异步的基于 TLS 加密的 Modbus 服务器。

(10)StartAsyncUdpServer: 这个函数用于启动一个异步的基于 UDP 的 Modbus 服务器。

(11)StartSerialServer: 这个函数用于启动一个同步的基于串口的 Modbus 服务器。

(12)StartTcpServer: 这个函数期望用于启动一个同步的基于 TCP/IP 的 Modbus 服务器。(备注:源码其实是异步的)

(13)StartTlsServer: 这个函数期望用于启动一个同步的基于 TLS 加密的 Modbus 服务器。(备注:源码其实是异步的)

(14)StartUdpServer: 这个函数期望用于启动一个同步的基于 UDP 的 Modbus 服务器。(备注:源码其实是异步的)

这些模块和函数提供了多种不同类型的 Modbus 服务器的实现方式,可以根据具体的需求选择合适的模块和函数来创建和启动 Modbus 服务器。

2、模块的选用

StartAsyncTcpServerStartTcpServerpymodbus 库中用于启动 Modbus TCP 服务器的两种不同的方法,其主要区别在于同步(Synchronous)和异步(Asynchronous)执行方式。

(1)StartAsyncTcpServer(异步方式):

StartAsyncTcpServer 是一个异步函数,它使用 Python 的 asyncio 模块来实现异步的 Modbus TCP 服务器。在异步编程中,事件循环(event loop)可以处理多个任务,使得程序在等待某些耗时操作(比如 I/O 操作)时不会被阻塞。这意味着它可以同时处理多个客户端连接,提高了服务器的并发性能。

该函数的调用方式是异步的,需要在异步上下文(比如异步函数内部或者异步脚本中)使用。

(2)StartTcpServer(同步方式):

StartTcpServer 是一个同步函数,它使用 Python 的标准同步执行方式,会阻塞当前线程。在同步模式下,每次只能处理一个客户端连接。这意味着服务器只能顺序处理客户端请求,一个接一个地处理。

该函数的调用方式是同步的,可以在任何地方调用。

总之,选择哪种方式取决于你的应用场景。如果需要处理大量并发连接并提高性能,可以选择异步方式;如果简单的同步处理能够满足需求,可以选择同步方式。

本文采用StartAsyncTcpServer,所以他涉及到的模块是StartTcpServer,源码如下:

def StartTcpServer(**kwargs):  # pylint: disable=invalid-name"""Start and run a serial modbus server."""return asyncio.run(StartAsyncTcpServer(**kwargs))

如果要停止异步,需要调用ServerAsyncStop模块。

二、一个Demo

1、服务端读写自身的保持寄存器的示例

import asyncio
import threading
import time
import json
from pymodbus.server import StartTcpServer, ServerAsyncStop
from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSlaveContext, ModbusServerContextif __name__ == "__main__":# Modbus TCP服务器的IP地址和端口号server_ip = "192.168.1.188"port = 502station = 1# 创建一个数据存储区,用于存储从客户端读取的数据store = ModbusSlaveContext(hr=ModbusSequentialDataBlock(0, [0] * 100))# 创建一个服务器上下文,用于处理客户端的请求context = ModbusServerContext(slaves=store, single=True)# 启动ModBusTCP服务器# 创建并启动线程(启动异步服务器)# StartTcpServer(context=context, address=(server_ip, port))modbus_server_thread = threading.Thread(target=StartTcpServer, kwargs=({"context":context, "address":(server_ip, port)}))modbus_server_thread.start()# 设置保持寄存器的0地址的值为s# 定义函数参数fc_as_hex = 0x03  # 功能码,例如读保持寄存器是"0x03"write_address = 0  # 起始地址read_address = 10read_count = 1values = [115]  # 触发指令s 要设置的多个值列表,如[10, 20, 30]# 调用函数,设置0地址为触发指令sstore.setValues(fc_as_hex, write_address, values)# 获取保持寄存器的值并打印hr_values = store.getValues(3, read_address, count=read_count)print("Hold Register Values:", hr_values)assert hr_values == [0], print("测试失败!")time.sleep(10)try:print("停止服务器")asyncio.run(ServerAsyncStop())  # 停止服务器except:pass

相关文章:

python实现ModBusTCP协议的server

python实现ModBusTCP协议的server是一件简单的事情,只要通过pymodbus、pyModbusTCP等模块都可以实现,本文采用pymodbus。 相关文章见: python实现ModBusTCP协议的client-CSDN博客 一、了解pymodbus的Server 1、pymodbus.server的模块 pym…...

AndroidStudio编译错误‘android.injected.build.density‘ is deprecated

问题 AndroidStudio编译错误 The option ‘android.injected.build.density’ is deprecated. It was removed in version 8.0 of the Android Gradle plugin. Density property injection from Android Studio has been removed. 解决 app/build.gradle 中这行 apply plugi…...

计网小题题库整理第一轮(面向期末基础)(3)

基础选择题的最后一章更新,看完期末75至少没问题~ 前情提要: 计网小题题库整理第一轮(12期) 一.选择题 1、 目前,最流行的以太网组网的拓扑结构是( C )。 A) 总线结构 B) 环…...

进程控制(一):进程终止

文章目录 进程控制(一)进程终止运行正常退出码 运行异常进程正常/异常总结 进程控制(一) 在前文中,我们初步了解了进程的概念,以及通过fork函数来创建子进程,并对于为什么运行一个程序&#xf…...

特殊类设计[下] --- 单例模式

文章目录 5.只能创建一个对象的类5.1设计模式[2.5 万字详解:23 种设计模式](https://zhuanlan.zhihu.com/p/433152245)5.2单例模式1.饿汉模式1.懒汉模式 6.饿汉模式7.懒汉模式7.1饿汉模式优缺点:7.2懒汉模式1.线程安全问题2.单例对象的析构问题 8.整体代码9.C11后可…...

计算机网络-应用层(1)

一、DNS 域名系统 (DNS) 是把主机域名解析为IP地址的系统。该系统是由解析器和域名服务器组成的。采用UDP 协议,较少情况下使用TCP 协议,端口号均为53。 域名系统由三部分构成: DNS 名字空间、域名服务器、 DNS客户机。 (1)根域&#xff1a…...

Kotlin基础——枚举、When、in、for

枚举 声明只有值的枚举 enum class Color {RED, GREEN, BLUE }此外还可以增加属性和方法,如果需要在枚举类中定义方法,要使用分号把枚举常量列表和方法定义分开,这也是Kotlin唯一必须使用分号的地方 enum class Color(val r: Int, val g: …...

C++编程题目------平面上的最接近点对(分治算法)

题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 输入格式 第一行一个整数 n,表示点的个数。 接下来 n 行,每行两个实数 x,y ,表示一个点的行…...

Linux下的文件操作和文件管理

文章目录 应用编程文件操作文件描述符open函数write函数read函数close函数lseek函数文件操作例子 文件管理文件基本知识文件类型文件共享空洞文件错误处理退出程序原子操作fcntl和ioctl截断文件stat函数软链接和硬链接 应用编程 系统调用(system call)是Linux内核提供给应用层…...

设计模式之桥梁模式

什么是桥梁模式 桥梁模式(Bridge Pattern)也称为桥接模式,属于结构型模式,它主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥梁模式将抽象部分与它的具体实现部分分离,使它们都可以独立地变…...

“从部署到优化,打造高效会议管理系统“

目录 引言一、部署单机项目 - 会议OA1.1 硬件和软件环境准备1.2 检查项目1.3 系统部署1.后端部署 二、部署前后端分离项目 - SPA项目后端部署2.前端部署 总结 引言 在现代化办公环境中,会议是组织沟通、决策和合作的重要方式之一。为了提高会议的效率和质量&#x…...

Facebook广告效果数据获取

一、背景 公司每年在Facebook和Google上投放了大量的广告,我总不能让老板登录Facebook广告投放平台上去看广告效果,其实老板只关注每天花了多少钱引来了多少客户,每个客户平均花费多少钱,其它的他才不关心,有Facebook…...

nlp之文本转向量

文章目录 代码代码解读 代码 from tensorflow.keras.preprocessing.text import Tokenizer # 标记器(每一个词,以我们的数值做映射,)words [LaoWang has a Wechat account., He is not a nice person., Be careful.] # 把这句话中每一个单词&#xf…...

【luckfox】添加压力传感器hx711

文章目录 前言一、参考资料二、电路图三、驱动四、makefile——添加驱动五、dts——使能gpio5.1 参考5.2 改动1—— hx117节点5.3 改动2——引脚节点5.4 已经被定义的引脚5.5 gpio源码 六、改动总结——使能hx711七、验证驱动添加八、编写测试文件8.1 测试代码8.2 配置编译环境…...

C++11的lambda表达式

lambda来源于函数式编程的概念。C11这次终于把lambda加进来了。 lambda表达式有如下优点: 1、声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护…...

矩阵特征值与特征向量的理解

各位朋友大家好,我是小C哈哈哈,很高兴认识大家,在这里,我会将一些枯燥难懂的数学和算法知识以图片或动画的形式通俗易懂的展现给大家,希望大家喜欢。 线性代数中的矩阵特征值与特征向量这两个基本概念总是让很多人摸不…...

云原生安全:如何保护云上应用不受攻击

文章目录 云原生安全的概念1. 多层次的安全性2. 自动化安全3. 容器安全4. 持续监控5. 合规性 云原生安全的关键挑战1. 无边界的环境2. 动态性3. 多云环境4. 容器化应用程序5. API和微服务 如何保护云上应用不受攻击1. 身份验证和访问控制示例代码: 2. 数据加密示例代…...

如何在用pip配置文件设置HTTP爬虫IP

首先,定义问题:在 Pip 中设置HTTP爬虫IP服务器,以便在网络上进行访问和下载。 亲身经验:我曾经遇到过类似问题,通过设置HTTP爬虫IP服务器成功解决了网络访问问题。 数据和引证:根据 pip 官方文档&#xff…...

2023MathorCup高校数模挑战赛B题完整解题代码教程

赛道 B: 电商零售商家需求预测及库存优化问题 问题背景: 电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库, 电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策, 大数据智能驱动的供应链…...

《动手学深度学习 Pytorch版》 10.7 Transformer

自注意力同时具有并行计算和最短的最大路径长度这两个优势。Transformer 模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管 Transformer 最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语…...

ORACLE-递归查询、树操作

1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…...

MySQL篇---第四篇

系列文章目录 文章目录 系列文章目录一、并发事务带来哪些问题?二、事务隔离级别有哪些?MySQL的默认隔离级别是?三、大表如何优化?一、并发事务带来哪些问题? 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对 同一数据进行操作…...

em/px/rem/vh/vw单位的区别

一、绝对长度单位 1.px 表示像素,显示器上每个像素点大小都是相同的 二、相对长度单位 2.em 相对于当前对象内文本的字体尺寸,如未设置对行内文本字体的尺寸,则相对于浏览器的默认字体(1em16px) em值不是固定的&…...

【C++】多态 ③ ( “ 多态 “ 实现需要满足的三个条件 | “ 多态 “ 的应用场景 | “ 多态 “ 的思想 | “ 多态 “ 代码示例 )

文章目录 一、" 多态 " 实现条件1、" 多态 " 实现需要满足的三个条件2、" 多态 " 的应用场景3、" 多态 " 的思想 二、" 多态 " 代码示例 一、" 多态 " 实现条件 1、" 多态 " 实现需要满足的三个条件 &q…...

创建一个Keil项目

1、创建项目 2、选择存放的文件夹,还有设置项目名 3、选择型号(因为没有STC,用下面这个替代,功能差不多) 4、选择不用启动文件 5、就会得到下面这个,可以在Source Group 1下面编写代码了 6、右键source Group 1,添加c语…...

Xray的简单使用

xray 简介 xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法效率高。支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均…...

Linux Ubunto Nginx安装

一 安装前 环境准备 gcc $ sudo apt-get install gcc zlib $ sudo apt-get install zlib1g-dev pcre $ sudo apt-get install libpcre3 libpcre3-dev openssl $ sudo apt-get install openssl libssl-dev‘ ubuntu 安装 libssl-dev失败的解决方案 1.安装aptitude sudo apt-g…...

深度学习中的epoch, batch 和 iteration

名词定义epoch使用训练集的全部数据进行一次完整的训练,称为“一代训练”batch使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这样的一部分样本称为:“一批数据”iteration使用一个batch的数据对模型进行一次参数更新的过…...

unity开发安卓视频文件适配手机和平板

using UnityEngine; using UnityEngine.UI;public class VideoResize : MonoBehaviour {private RawImage rawImage;private VideoPlayer videoPlayer;private void Start(){rawImage GetComponent<RawImage();videoPlayer GetComponent<VideoPlayer>();// 播放视频…...

NLP之RNN的原理讲解(python示例)

目录 代码示例代码解读知识点介绍 代码示例 import numpy as np import tensorflow as tf from tensorflow.keras.layers import SimpleRNNCell# 第t时刻要训练的数据 xt tf.Variable(np.random.randint(2, 3, size[1, 1]), dtypetf.float32) print(xt) # https://www.cnblog…...