前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用Python实现modbus slave

用Python实现modbus slave

作者头像
py3study
发布于 2020-01-10 12:30:06
发布于 2020-01-10 12:30:06
4.6K13
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:3
代码可运行

最近在研究modbus master和modbus slave。项目要求实现modbus slave虚拟机来做功能测试。

网上modbus master相关的demo很多,但是modbus slave相关的demo很少。还是Google给力,最后在google上找到一些有用的方法实现。

python是很容易实现modbus slave的工具,简单易上手。

下面是自己写的modbus slave demo。先安装Anaconda,Anaconda相当于安装了python,使用自带的集成开发环境spyder。用的是modbus_tk库实现modbus slave。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 21 17:00:53 2017

@author: Administrator
"""

import sys
import struct  
import modbus_tk 
import modbus_tk.defines as mtk  
import modbus_tk.modbus  
import modbus_tk.modbus_tcp  
import time  
import random  
import string
  
logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")  
  
try:  
    #server = modbus_tk.modbus_tcp.TcpServer()  
    #这里的端口和地址都是默认的,地址是本地:  
    server = modbus_tk.modbus_tcp.TcpServer(port=502, address='127.0.0.1', timeout_in_sec=3)         
    server.start()  
    slave_1 = server.add_slave(1)  
   # slave_2 = server.add_slave(2)
    # 创建寄存器,寄存器的别名为block1,寄存器为保持寄存器(Holding_Register),寄存器起始地址为0,寄存器个数为...
    slave_1.add_block('block1', modbus_tk.defines.HOLDING_REGISTERS, 0, 11) 
    slave_1.set_values('block1', 0, 10*[0])
    slave_1.set_values('block1', 10, 255)   #PLC--0011寄存器的初始值为高八位全为0,低八位全为1
   # slave_1.add_block('block2', modbus_tk.defines.HOLDING_REGISTERS, 2, 1)
    #给slave_1添加一个模块(模块名,只读,地址,长度)  
    valueAll = slave_1.get_values('block1', 0, 11)
    print 'valueAll: ', valueAll

    valueSet = slave_1.get_values('block1', 0, 1)   # 寄存器0000 -- 状态位初始值为全0
    print 'valueSet:  ', valueSet

    while True:       
        value = slave_1.get_values('block1', 10, 1)    
        print 'value', value

        ss = int(str(value[0]))
        print 'ss:', ss
        
    ## 判断执行机构开启操作
        if (((ss & 256) == 256) and (ss & 1) == 0):   # 256  判断“补光灯1启动”
            value1 = slave_1.get_values('block1', 0, 1)
            print 'open value1:', value1
            ss1 = int(str(value1[0]))
            slave_1.set_values('block1', 0, (ss1 | 256))
            valueSet = slave_1.get_values('block1', 0, 1)
            print 'valueSet:  ', valueSet
            
        if (((ss & 256<<1) == 256<<1) and  (ss & 1<<1) == 0):   # 512 左移一位 判断“补光灯2启动”
            value2 = slave_1.get_values('block1', 0, 1)
            print 'open value2:', value2
            ss2 = int(str(value2[0]))
            slave_1.set_values('block1', 0, (ss2 | 512))

        if (((ss & 256<<2) == 256<<2) and (ss & 1<<2) == 0):   # 1024 左移二位 判断“如气风机启动”
            value3 = slave_1.get_values('block1', 0, 1)
            print 'open value3:', value3
            ss3 = int(str(value3[0]))
            slave_1.set_values('block1', 0 , (ss3 | 1024))
                
        if (((ss & 256<<3) == 256<<3) and (ss & 1<<3) == 0):   # 2048 左移三位 判断“供液泵启动”   
            value4 = slave_1.get_values('block1', 0, 1)
            print 'open value4:', value4
            ss4 = int(str(value4[0]))
            slave_1.set_values('block1', 0 , (ss4 | 2048))
                
        if (((ss & 256<<4) == 256<<4) and (ss & 1<<4) == 0):   # 4096 左移四位 判断“回液泵启动”        
            value5 = slave_1.get_values('block1', 0, 1)
            print 'open value5:', value5
            ss5 = int(str(value5[0]))
            slave_1.set_values('block1', 0 , (ss5 | 4096))
           
    ##  判断执行机构关闭操作
        if ((ss & 1) == 1):                                    # 判断“补光灯1关闭”
            value01 = slave_1.get_values('block1', 0, 1)
            print 'close value01: ', value01
            ss01 = int(str(value01[0]))
            slave_1.set_values('block1', 0, (ss01 & (~256)))
            
        if ((ss & 1<<1) == 1<<1):                             # 判断“补光灯2关闭”
            value02 = slave_1.get_values('block1', 0, 1)
            print 'close value02: ', value02
            ss02 = int(str(value02[0]))
            slave_1.set_values('block1', 0, (ss02 & (~(256<<1))))
            
        if ((ss & 1<<2) == 1<<2):                              # 判断“如气风机关闭”
            value03 = slave_1.get_values('block1', 0, 1)
            print 'close value03: ', value03
            ss03 = int(str(value03[0]))
            slave_1.set_values('block1', 0, (ss03 & (~(256<<2))))   
            
        if ((ss & 1<<3) == 1<<3):                             # 判断“供液泵关闭”
            value04 = slave_1.get_values('block1', 0, 1)
            print 'close value04: ', value04
            ss04 = int(str(value04[0]))
            slave_1.set_values('block1', 0, (ss04 & (~(256<<3)))) 
            
        if ((ss & 1<<4) == 1<<4):                             # 判断“回液泵关闭”
            value05 = slave_1.get_values('block1', 0, 1)
            print 'close value05: ', value05
            ss05 = int(str(value05[0]))
            slave_1.set_values('block1', 0, (ss05 & (~(256<<4))))        
            
            
        value0 = slave_1.get_values('block1', 0, 1) 
        print 'value0:', value0
            
        value_all = slave_1.get_values('block1', 0, 11)
        sys.stdout.write('done: values read: %s\r\n' % (str(value_all)))
        


        print '======================'
        time.sleep(0.5)


except:  
    print '============error==========='  
finally:  
    print '=========stop========'  
    server.stop()  
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
dalao你好,如果我用的是modbus_rtu协议怎么改以实现同样的效果?
dalao你好,如果我用的是modbus_rtu协议怎么改以实现同样的效果?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Jedis 对 Redis 的操作详解
本篇主要阐述Jedis对redis的五大类型的操作:字符串、列表、散列、集合、有序集合。
芋道源码
2018/12/11
2.4K0
挑战30天学完Python:Day7数据类型-字典dict
上面的例子中对应的值可以是任何数据类型,如:字符串、布尔值、列表、元组、集合或字典。
MegaQi
2023/10/21
2070
挑战30天学完Python:Day7数据类型-字典dict
.NET性能优化-使用ValueStringBuilder拼接字符串
这一次要和大家分享的一个Tips是在字符串拼接场景使用的,我们经常会遇到有很多短小的字符串需要拼接的场景,在这种场景下及其的不推荐使用String.Concat也就是使用+=运算符。 目前来说官方最推荐的方案就是使用StringBuilder来构建这些字符串,那么有什么更快内存占用更低的方式吗?那就是今天要和大家介绍的ValueStringBuilder。
用户9127601
2022/06/09
5470
.NET性能优化-使用ValueStringBuilder拼接字符串
Hash表:使用PHP实现Hash表功能
Hash表作为最重要的数据结构之一,也叫做散列表。使用PHP实现Hash表的功能。PHP可以模拟实现Hash表的增删改查。通过对key的映射到数组中的一个位置来访问。映射函数叫做Hash函数,存放记录的数组称为Hash表。 Hash函数把任意长度的和类型的key转换成固定长度输出。不同的key可能拥有相同的hash。 Hash表的时间复杂度为O(1)
用户1448800
2021/08/16
6490
Jedis基础详解
Jedis 使用Java来操作Redis 什么是Jedis 是Redis官方推荐的Java操作Redis中间件, 如果你要使用Java操作Redis, 那么就该对jedis熟悉 测试 导入对应的依赖 <!-- 导入jedisd的包 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version>
后端码匠
2021/01/20
3.3K1
H7-TOOL的LUA小程序教程第5期:串口开发,含Modbus(2022-01-16)
LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。 TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。
Simon223
2022/03/10
5500
H7-TOOL的LUA小程序教程第5期:串口开发,含Modbus(2022-01-16)
学好 Yaml
之前是快速上手 yaml,这可以让我学习 kubernetes,但是真要工作用,总是差了一点东西,所以今天回炉重造。
看、未来
2022/09/27
9900
SpringBoot中Redis的set、map、list、value、实体类等基本操作介绍
林老师带你学编程
2018/01/04
4.6K0
Python学习记录06-字典中的键映射多个值
如果想一个key映射多个value, 我们就需要让value也是一个容器,可以是列表,也可以集合。看具体的使用场景。列表的特性是可以保持顺序,集合的特性是可以去重。 可以用以下的方式来创建一个映射多个value 的字典
huolong
2023/09/07
1.1K0
Python入门到放弃(十二) | Python在工控领域的应用(1)
Python 诞生之初就被誉为最容易上手的编程语言。进入火热的 AI 人工智能时代后,它也逐渐取代 Java,成为编程界的头牌语言。
剑指工控
2021/11/09
2.4K0
Python-科学计算-pandas-22-按某列排序
系统:Windows 10 编辑器:JetBrains PyCharm Community Edition 2018.2.2 x64 pandas:1.1.5
zishendianxia
2021/09/29
1.6K0
Python 系列文章 —— Python redis 详解
redis import redis #导入redis模块 # 建议使用以下连接池的方式 # 设置decode_responses=True,写入的KV对中的V为string类型,不加则写入的为字节类型。 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, decode_responses=True) rs = redis.Redis(connection_pool=pool) # key="color",value="red
玩转编程
2022/01/15
3770
C# 数据操作系列 - 16 SqlSugar 完结篇
前一篇我们详细的介绍了SqlSugar的增删改查,那些已经满足我们在日常工程开发中的使用了。但是还有一点点在开发中并不常用,但是却非常有用的方法。接下来让我们一起来看看还有哪些有意思的内容。
程序员小高
2020/05/29
2.6K0
C# 数据操作系列 - 16 SqlSugar 完结篇
Python pymodbus类库使用学习总结
https://www.python.org/ftp/python/3.9.13/python-3.9.13-amd64.exe
授客
2024/11/21
3560
深入理解 QueryDSL 的 BooleanBuilder:构建复杂逻辑表达式
在 Java 的查询构建库 QueryDSL 中, BooleanBuilder 是一个非常有用的工具类。它允许开发者通过链式调用轻松地构建复杂的布尔逻辑表达式。本文将详细介绍 BooleanBuilder 的各种方法,并通过代码示例展示如何使用这些方法。
訾博ZiBo
2025/01/06
1560
「 Map最佳实践」什么时候适合使用 Map 而不是 Object
「Map」映射是一种经典的数据结构类型,其中数据以 「key/value」 的键值对形式存在
秋风的笔记
2020/10/27
9000
「 Map最佳实践」什么时候适合使用 Map 而不是 Object
一文看懂 YAML
YAML 并不是一种新奇的语言,YAML 首次发表于 2001 年,距离现在已经过去差不多 20 个年头。YAML 虽然不如 JSON、XML 之类的语言流行,应用也没有那么广泛,但是 YAML 也有它的优势。
陈皮皮
2020/06/17
1.1K0
[快学Python3]INI文件读写
概述 ini是我们常见到的配置文件格式之一。 ini是微软Windows操作系统中的文件扩展名(也常用在其他系统)。 ini“初始化(Initial)”的缩写。正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。 其基本组成形式如下: [section_1] key1 = value1 key2 = value2 key3 = value3 key4 = value4 [section_2] key1 = value1 key2 = value2 key3 = value3 ke
苦叶子
2018/04/09
2.4K0
网络基础 Modbus协议学习总结
Modbus协议,首先从字面理解它包括Mod和Bus两部分,首先它是一种bus,即总线协议,总线就意味着有主机,有从机,这些设备在同一条总线上。
授客
2024/11/21
3820
网络基础 Modbus协议学习总结
关于新型肺炎数据分析和可视化系列笔记二-获取各省历史数据
新找到关于各省各地市的日历史数据接口,为了避免不必要的麻烦,把对方的接口地址已屏蔽,下载的历史数据也仅供学习和参考;现在的所有数据已收集完成。
python与大数据分析
2022/03/11
2770
推荐阅读
相关推荐
Jedis 对 Redis 的操作详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验