Python_Modbus_RTU_通讯Demo
之前利用Python进行Modbus_TCP进行数据接收,本次需要利用串口进行数据传输,学习Modbus_RTU的简单实现
首先要在创建两个虚拟串口,利用VSPD工具即可。在一台电脑上实现数据的发送和接收

进入Python IDE进行slave端的编写
import serial
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import time
def ModbusRTU_Slave():
try:
# 设定串口为从站
# 外置参数包括端口 port = "COM3" 波特率:9600
server= modbus_rtu.RtuServer(serial.Serial(port="com3",baudrate=9600, bytesize=8, parity='N', stopbits=1))
server.start()
print("runing...")
SLAVE1 = server.add_slave(1)
SLAVE1.add_block('A', cst.HOLDING_REGISTERS, 0, 4) # 地址0,长度4
increase_num = 17000
for i in range(300):
SLAVE1.set_values('A', 0, [17000, i + 1, i + 2]) # 改变在地址0处的寄存器的值
time.sleep(0.1)
for i in range(1500):
increase_num = increase_num - 1
SLAVE1.set_values('A', 0, [increase_num, i + 1, i + 2]) # 改变在地址0处的寄存器的值
time.sleep(0.1)
for i in range(800):
SLAVE1.set_values('A', 0, [10000, i + 1, i + 2]) # 改变在地址0处的寄存器的值
time.sleep(0.1)
for i in range(800):
SLAVE1.set_values('A', 0, [17000, i + 1, i + 2]) # 改变在地址0处的寄存器的值
time.sleep(0.1)
except Exception as exc:
print(str(exc))
再进行master端的编写
# 数据接收端
def ModbusRTU_Master():
try:
# 设定串口为从站
# 外置参数包括端口 port = "COM3" 波特率:9600
master = modbus_rtu.RtuMaster(serial.Serial(port="com4",baudrate=9600, bytesize=8, parity='N', stopbits=1))
master.set_timeout(1.0)
master.set_verbose(True)
# 读保持寄存器
read = master.execute(1, cst.HOLDING_REGISTERS, 0, 4) # 这里可以修改需要读取的功能码
print(red)
except Exception as exc:
print(str(exc))
补充功能码
功能代码cst
1~255中1~21是常用的,以下是读写专用的功能码
READ_COILS = 01 读线圈,位操作
READ_DISCRETE_INPUTS = 02 读离散输入状态,位操作
READ_HOLDING_REGISTERS = 03 读保持寄存器,字操作
READ_INPUT_REGISTERS = 04 读输入寄存器,字操作
WRITE_SINGLE_COIL = 05 写单线圈,位操作
WRITE_SINGLE_REGISTER = 06 写单一寄存器,字操作
WRITE_MULTIPLE_COILS = 15 写多个线圈【强制多点线圈】,位操作
WRITE_MULTIPLE_REGISTERS = 16 写多寄存器【写乘法寄存器】,字操作
演示Demo 创建一个项目 1. 通过Modbus_RTU读取 数据 在通过Modbus_RTU将数据发出
首先创建四个虚拟串口

利用Modbus 工具 模拟数据发送 和 接收 【注意】:modbus poll 设置中的数据长度一定要和程序中推送的长度一致 ,在这个问题上浪费了好长时间 哎

Python程序,其中包含了tcp 和 rtu的内容 可以通过JSON配置文件实现协议切换
import time
from datetime import datetime
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp
from modbus_tk import modbus_rtu
import serial
import json # JSON 文件初始化
def InitJSON():
global filejson
try:
with open('20191219_1443.json', 'r') as f:
filejson = json.load(f)
except FileNotFoundError:
print('无法打开指定的文件!')
except LookupError:
print('指定了未知的编码!')
except UnicodeDecodeError:
print('读取文件时解码错误!') # modbus 相关参数初始化
def ModbusInit():
# 首先判断数据传输协议 Modbus_TCP 还是 RTU
if filejson['ModbusInit']['Modbus_Mode'] == "Modbus_TCP":
print("Modbus_Mode = Modbus_TCP")
Modbus_master_IP = filejson['ModbusInit']['Modbus_master_IP']
Modbus_master_port = filejson['ModbusInit']['Modbus_master_port']
MASTER = modbus_tcp.TcpMaster(host=Modbus_master_IP, port=Modbus_master_port)
MASTER.set_timeout(5.0)
Modbus_slave_IP = filejson['ModbusInit']['Modbus_slave_IP']
Modbus_slave_port = filejson['ModbusInit']['Modbus_slave_port']
SLAVE = modbus_tcp.TcpServer(address=Modbus_slave_IP, port=Modbus_slave_port)
# SLAVE.set_timeout(5.0)
else:
print("Modbus_Mode = Modbus_RTU")
Modbus_master_PORT = filejson['ModbusInit']['Modbus_master_PORT']
Modbus_master_baudrate = filejson['ModbusInit']['Modbus_master_baudrate']
print(Modbus_master_PORT)
MASTER = modbus_rtu.RtuMaster(serial.Serial(port=Modbus_master_PORT, baudrate=Modbus_master_baudrate))
MASTER.set_timeout(5.0)
Modbus_slave_PORT = filejson['ModbusInit']['Modbus_slave_PORT']
print(Modbus_slave_PORT)
Modbus_slave_baudrate = filejson['ModbusInit']['Modbus_slave_baudrate']
SLAVE = modbus_rtu.RtuServer(serial.Serial(port=Modbus_slave_PORT, baudrate=Modbus_slave_baudrate, bytesize=8, parity='N', stopbits=1))
# SLAVE.set_timeout(5.0)
SLAVE.start()
print("runing...")
SLAVE1 = SLAVE.add_slave(1)
SLAVE1.add_block('warning', cst.HOLDING_REGISTERS, 0, 4) # 地址0,长度1
return MASTER,SLAVE1 def main():
# 初始化JSON 文件
InitJSON()
# modbus 初始化
MASTER, SLAVE1 = ModbusInit() a = filejson['DistanceParam']['EquationParamA']
b = filejson['DistanceParam']['EquationParamB']
print("方程参数a = {},b= {}\n".format(a, b))
while(1):
# 测试 用来获取数据
num = MASTER.execute(1, cst.READ_HOLDING_REGISTERS, 0, 1)[0]
# 获取数据
# num = MASTER.execute(1, cst.READ_INPUT_REGISTERS, 0, 1)[0]
print("GetV={}".format(num))
SLAVE1.set_values('warning', 0, num) # 改变在地址0处的寄存器的值
time.sleep(filejson['WhileTime'])
if __name__ == '__main__':
main()
Python_Modbus_RTU_通讯Demo的更多相关文章
- 闲来无事,写个基于UDP协议的Socket通讯Demo
项目一期已经做完,二期需求还没定稿,所以最近比较闲. 上一篇写的是TCP协议,今天写一下UDP协议.TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接:UDP是无连接协议,所以发送消息 ...
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- NodeJs多进程和socket.io通讯-DEMO
一.开启多进程 const os = require('os'); const cp = require('child_process'); const forkList = {}; const fo ...
- Indy10 即时通讯Demo
最近闲来无事,重新学习了Indy10,顺手写了一段即时通讯代码.与上次写的笔记有不同之处,但差别不大. 未研究过TCP打洞技术,所以下面的代码采用的是 客户端--服务器--客户端 模式,也就是服务 ...
- AngularJS中Scope间通讯Demo
在AngularJS中,每一个controller都有对应的Scope,而Scope间有时候需要通讯.比如有如下的一个controller嵌套: <body ng-controller=&quo ...
- java socket 和.net socket 通讯 demo
结束符协议"##" import java.io.BufferedReader; import java.io.IOException; import java.io.InputS ...
- 【原创】java socket 和.net socket 通讯 demo
结束符协议"##" import java.io.BufferedReader; import java.io.IOException; import java.io.InputS ...
- 轻量级通信引擎StriveEngine —— C/S通信demo(附源码)
前段时间,有几个研究ESFramework的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关系.也不 ...
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
随机推荐
- vue怎么将一个组件引入另一个组件?
项目是由的vue-cli搭建 1.这里有两个组件,需求是把newComponents.vue里面的东西引入到helloWorld里面 2.index.js里面的配置 3.newComponents里面 ...
- 【原】Python基础-字典
字典是Python唯一内建的映射类型.键可以是数字,字符串和元组. 1 字典的创建 方法一:直接创建 例如: >>> dict = {'key1':'value1', 20: 80} ...
- SpringCloud介绍及入门一
springcloud是什么 基于spring boot实现的服务治理工具包,管理和协微服务 把别人的东西拿来组合在一起,形成各种组件 微服务协调者[service registtry注册中心 Eur ...
- Qt代码配色VS2015风格
通过本文的方法可以将VS2015的深色主题界面应用到Qt上,对于喜欢VS代码风格配色的人应该会比较有用 效果图: 1. 设置IDE主题 为了配合vs深色的代码编辑背景,将Qt的主题也换成深色版本 2 ...
- MySQL VARCHAR字段最大长度到底是多少
MySQL VARCHAR字段最大长度到底是多少 varchar(n),n表示什么? MySQL5.0.3之前varchar(n)这里的n表示字节数 MySQL5.0.3之后varchar(n)这 ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_04-Eureka注册中心-将服务注册到Eureka Server
cms相当于客户端 配置客户端的信息 后面加逗号分隔开 50102表示向两台eureka服务上报服务,如果有一台死掉了 那么还可以上另外的一台去注册服务 直接把ip注册到eureka 启动类加注解 重 ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_12-前端集成认证授权-携带JWT授权
携带JWT授权 登陆后jwt已经存到了sessionStorage里面 当进行微服务的请求就要携带令牌.我们在拦截器里面做文章. 在axios的intercepters拦截器上 手工的给这个课程 造一 ...
- pyecharts绘画优美图形
常用图形:柱形图-折线图-饼图-散点图 from pyecharts import Line, Bar, Pie, EffectScatter # 数据 attr =["衬衫", ...
- python检测文件的MD值
使用hashlib模块,可对文件MD5一致性加密验证: #python 检测文件MD5值 #python version 2.6 import hashlib import os,sys #简单的测试 ...
- kubeadm 安装kubernetes1.6.2
准备工作 安装依赖 yum install -y wget vim net-tools epel-release 修改内核参数 cat <<EOF > /etc/sysctl.d/k ...