modbus python开发(一)

python开发modbus实例记录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
    • 从不知道modbus是什么,到独立开发出来可以使用的modbus协议,从无到有、从0到1的一点点记录,希望能给像我一样的小白一点启示,花一点读一篇文章能够节约自己开发modbus的时间。愿你粗略读,仔细想,慢慢写程序,早日完成项目。
  • 0 编程基础
  • 1、modbus初识
    • 1.1 modbus协议与串口通讯的区别
  • 2 modbus编程
    • 2.1 modbus编程初步实验
    • 2.2 modbus slave工具使用


前言

从不知道modbus是什么,到独立开发出来可以使用的modbus协议,从无到有、从0到1的一点点记录,希望能给像我一样的小白一点启示,花一点读一篇文章能够节约自己开发modbus的时间。愿你粗略读,仔细想,慢慢写程序,早日完成项目。

提示:以下是本篇文章正文内容,下面案例可供参考

0 编程基础

python编程在我学习生涯中基本没有出现,毕业以后才开始使用python编程的,前期使用python编写了串口通讯以及相关的UI。串口通讯能够简单的发送和接受ASCII数据(采用的是字符串模式),能够简单的实现对外部设备的控制。公司项目主要使用输入、输出模块,串口通讯的前期编程可以满足这方面的需求,除此之外,没有实现其他功能。
我就职于一家普通的小国企,公司对于python编程的需求并不大,主要是公司有一个已经申报的python相关的项目,相关负责人已经调岗。因此,临时找我来设计python编程,我用了20天左右的时间完成了上述内容:基于python的串口通讯以及UI设计(UI界面如下图所示)。
modbus python开发(一)_第1张图片
阐述上面的内容,并不是证明我有多牛逼,反正我想说明一下我只是一个小白,至少在python编程方面是这样的。刘未鹏在《暗时间》中阐述,编程是一门最不需要门槛的工作,以及对于写博客的建议,让我鼓起勇气写一下关于modbus调试内容。

1、modbus初识

周末与同事一起去调试使用modbus通讯的程控电源,按照厂家的说明文档,准备使用串口通讯工具给设备发送指令,指令发送过去设备毫无反应。我们商量了一下,要先确认一下硬件以及连线有没有问题:我们使用厂家提供的程序测试程控电源结果设备正常启动,问题出在我们自己身上。
再次返回去看程控电源说明书,如下图所示,同样都是数字发送,为什么厂家的程序可以成功?我们疑惑打咨询电话询问原因,厂家回复你们的串口通讯有问题,又将一个可以驱动程控电源的串口工具发给我们,我们简单测试了一下,结果仍然打脸,设备依旧正常启动,我们当场傻眼,后续与厂家进一步沟通,将我们串口工具截图发给他们,对方说使用16进制发送即可,我们试了一下,程控电源正常响应。
modbus python开发(一)_第2张图片

1.1 modbus协议与串口通讯的区别

经历了错误的实验我们意识到modbus通讯和串口通讯有区别,最明显的区别便是使用16进制发送数据,我们将使用16进制字符发送到(使用字符串采集的)串口工具上看看16进制究竟怎样,结果发现一串乱码。使用串口工具(自己设计的那个)接受程序直接退出,使用相同的后台程序发现问题,如图下图所示。由于在UI界面函数中,没有写接受错误的函数,因此,程序直接退出。后台程序中可以看出使用GBK格式读取错误。
modbus python开发(一)_第3张图片
“生死看淡,不服就干”,既然modbus躲不过去,那就看看modbus到底是什么东西,慢慢查阅资料发现modbus主要由地址、功能码、数据、校验等四部分组成。我们当前的任务是使用串口驱动程控电源,虽然通讯编码使用了modbus,其核心内容依旧不变,同样都是串口通讯(之前固执地认为)。
认识到问题所在那么编程方式也有两种:1. 直接采用16进制的方式发送数据;
2. 调用已有的modbus库;

2 modbus编程

究竟采用那种方式,起初没有什么想法,如果使用第一种那么以后每实现一个功能都要写一段新的代码,必然繁琐,但现在看起来更简单,在原用串口通讯的基础上加入16进制数据发送和读取即可,至于校验码可以写程序计算,实在不行那就自己计算出来再写上去,反正每一个功能都需要一段写的代码。
使用modbus库函数,在CSDN下了两个资源差点把我劝退,minimodbus中的一个函数就有1000余行的代码,我差点放弃这条路。(附上下载链接[【1】]【1.1】(https://download.csdn.net/download/weixin_38744207/11849227?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165261774016782388019960%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fdownload.%2522%257D&request_id=165261774016782388019960&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2downloadfirst_rank_ecpm_v1~rank_v31_ecpm-17-11849227-null-null.pc_v2_rank_dl_default&utm_term=python%20modbus%20rtu&spm=1018.2226.3001.4451.14))。看完程序骂骂天、怨怨地,程序还没有写出来生活还要继续啊。
冷静下来我开始质疑程序的正确性,又在各种论坛搜索,寻找可能实现的契机,在不懈努力下(找到链接【2】),给我打了一针强心剂。

2.1 modbus编程初步实验

链接【2】中使用了TCP通讯,但是这些不妨碍我们使用串口进行通讯,只是渠道不同而已其他功能一样。读这篇博文,利用pip下载了modbus-tk组件,复制了主函数,至于虚拟串口以前下过,也就没有继续下载,modbus slave 工具,在此时并未下载,后续调试功能下载了,那是后话。
注:虽说博主的标题是TCP通讯,看看代码其实博主使用了串口通讯,正好符合我的部分要求。
博文主函数仅对某个线圈进行读取,不能完全满足设计要求,因而继续探讨,继续寻找游泳的网络资源链接【3】,这篇博文是我写完程序的一个另一篇重要博文,那篇博主对modbus函数功能码从头到尾的进行了阐述,我使用的函数也在其中,我果断复制下来代码。利用写过多个寄存器的程序实现需求功能功能,事实证明我的决策完全没有问题,功能最终实现了,如图下图所示。运行稍稍修改的程序,利用串口工具接受代码,发现和所需求代码相同,基本实现目标。
modbus python开发(一)_第4张图片
代码如下所示:

import serial
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu


def mod(PORT="com11"):
    red = []
    alarm = ""
    try:
        # 设定串口为从站
        master = modbus_rtu.RtuMaster(serial.Serial(port=PORT,
                                                    baudrate=9600, bytesize=8, parity='N', stopbits=1))
        master.set_timeout(5.0)
        master.set_verbose(True)
        #print("zhengchang")
        # 读保持寄存器
        red = master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 9, output_value=[3])
        print(red)
        if red == (10,4):
            print("一切非常顺利,程序已执行")
        alarm = "正常"
        return list(red), alarm

    except Exception as exc:
        print(str(exc))
        alarm = (str(exc))

    return red, alarm  ##如果异常就返回[],故障信息


if __name__ == "__main__":
    mod()

2.2 modbus slave工具使用

首先,调试出来驱动代码仅仅是成功的一部分,并没有真正的成功,在python中执行这个函数实际上是有返回值的。在程序中实际上可以打印的,但是因为并没有modbus设备,所以函数没有采集到数据就直接退出了。
返回值red究竟是哪些数值,虽然在图1.1中程控电源说明书中以说明返回数值为01 10 00 0A 00 04 E1 C8,通过master.execute采集出来是怎样,其实无法知晓,因而必须使用modbus工具或者到现场去调试,调试出来的时候应该是凌晨1点钟,去现场可能性不太大,等着第二天去也不太现实(原因不便说明),我也不太喜欢等待,趁着有兴致一口气弄完,程序调试完尽情玩耍,写写调试过程,其乐无穷。
modbus slave工具是modbus数据的从端,配合我的python程序进行使用,能够对数据进行正常相应。同样附上modbus slave工具使用以及下载地址【5】。


salve工具配置需要注意一下,我的modbus程序选择地址是10,因而在modbus slave中请将地址改为10,如图所示。另外连接模式请选择为串口模式。
modbus python开发(一)_第5张图片

你可能感兴趣的:(物联网,iot,python)