我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用Python实现modbus slav

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用Python实现modbus slav

最近在研究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。


# -*- 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()  

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

用Python实现modbus slav

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

用Python实现modbus slav

最近在研究modbus master和modbus slave。项目要求实现modbus slave虚拟机来做功能测试。网上modbus master相关的demo很多,但是modbus slave相关的demo很少。还是Google给力,
2023-01-31

java如何利用socket通信实现Modbus-RTU通信协议

小编给大家分享一下java如何利用socket通信实现Modbus-RTU通信协议,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ModbusModbus是一种串行
2023-06-14

用python实现ping

这里使用的是最简易的方式,使用python的子进程管理模块,调用系统的ping命令,代码如下:import subprocess    import rep = subprocess.Popen(["ping.exe", 'google.c
2023-01-31

用 Python 实现 LDA

原文出处:Jordan BarberLDA 是什么LDA 演练需要用到的包导入文档清洗文档 分词移除停用词词干提取创建 document-term matrix应用 LDA 模型检查结果LDA 原理完整代码隐含狄利克雷分布(以下简写为 LD
2023-01-31

[Python]用python实现批量/

针对前面的代码 http://lxsym.blog.51cto.com/1364623/1065854,还存在的问题进行了改善:    1、去掉明文密码,通过交互输入密码    2、通过传参执行相关命令,增加灵活性    3、异常处理   
2023-01-31

使用 python 实现 Voronoi

以下程序 使用python实现 Voronoi图from PIL import Imageimport randomimport math def generate_voronoi_diagram(width, height, num_ce
2023-01-31

用Python实现Zabbix-API

做运维的朋友应该知道,公司IDC机房经常有上架、下架、报修和报废的服务器。如果服务器数量很多的时候很容易造成监控遗漏。       大的互联网公司把监控系统和CMDB(资产管理系统|配置管理数据库系统)集成在一起,当上架一台新机器的时候CM
2023-01-30

利用virtualenv实现Python

由于开发需求,需要Python2和Python3共存,利用当下最流行的虚拟环境工具virtualenv实现。#安装virtualenvpip install virtualenv#使用virtualenv创建虚拟环境virtualenv p
2023-01-31

实现正确实现Python调用jar包

博主最近在做python的项目,需要调用jar包,但是虽然参考了网上很多的教程,但是有一点是无法解决,那就是用python无法启动jvm虚拟机!!!这是所有工作的前提,重装了好多次也没有解决,最后请教大佬解决了。问题的关键点在于:电脑的位数
2023-01-31

Python基础 用Python实现时钟

语言:Python IDE:Python.IDE编写时钟程序,要求根据时间动态更新 代码思路 需求:5个Turtle对象, 1个绘制外表盘+3个模拟表上针+1个输出文字 Step1:建立Turtle对象并初始化 Step2:静态表盘绘制
2023-01-31

用python实现调用jar包

本文作者:botoo背景:python3.6 32位 + jre 32位 + windows64位首先环境搭建:安装jpype,安装的时候输入 pip install jpype1 (后面要加一个1)*一定要注意 jre和python的位数
2023-01-31

python调用mrjob实现hadoo

咱们一般写mapreduce是通过java和streaming来写的,身为pythoner的我,java不会,没办法就用streaming来写mapreduce日志分析。 这里要介绍一个模块,是基于streaming搞的东西。mrjob 可
2023-01-31

20190118-利用Python实现P

1.利用Python实现Pig Latin字母游戏“Pig Latin”是一个英语儿童文字改写游戏,整个游戏遵从下述规则:a. 元音字母是‘a’、‘e’、‘i’、‘o’、‘u’。字母‘y’在不是第一个字母的情况下,也被视作元音字母。其他字母
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录