pythonqt4上位机开发_「新阁教育」自由口通信上位机实战案例

1、引言

组态软件作为一种通用软件,体系结构较为庞大、功能软件包多、价格也比较昂贵,而且对于一些复杂的业务逻辑或自定义的协议,实现起来比较麻烦。近几年,C#/.NET上位机开发应用越来越广泛,相对于传统的组态软件的方式,C#开发上位机具有灵活、易学、扩展性强的特点。本文使用VS2019作为开发软件,SQLite作为数据存储软件,硬件使用厦门宇电温度控制器,开发一套通用的上位机监控系统。【公众号dotNet工控上位机:thinger_swj】

2、项目背景

第一次听说宇电这个品牌,是我的一个朋友说让我给他帮个忙,写一个上位机和他的仪表进行通信。我二话没说就答应了,刚开始认为是走Modbus通信,因为市场上大部分仪表都是通过Modbus通信的。然而,当我拿到产品之后,发现宇电仪表推荐使用的是AIBUS通信协议,于是就去宇电官网搜索相关资料了。AIBUS协议是宇电为AI系列仪表开发的一个协议,其指令比Modbus更简单、更可靠,而且通信速率比Modbus更高,同时也具备组网功能,可以在一个RS485总线上连接多达80台仪表。

3、仪表接线配置及协议说明

我使用的仪表型号是AI-500,在查阅完相关资料之后,开始对仪表进行接线,接线图在仪表的侧面,只是测试通信的话,只需要接好电源、Pt100和485通信。

b17f7e15d214a6a58cbd9c1bb309ec39.png

接线完成之后,需要设置一下仪表的相关参数,根据仪表的说明书,主要设置输入规格、通信地址、波特率这三个参数,如下表所示:

93e011b3bb8a3fce618889f5cebaeed3.png

参数设置完毕,可以看到仪表上已经可以显示室内温度,下一步就开始编写通信类库。编写之前首先要了解一下AIBUS通信协议:

AI 仪表采用16进制数据格式来表示各种指令代码及数据。AI仪表软件通讯指令经过优化设计,标准的通讯指令只有两条,一条为读指令,一条为写指令,两条指令使得上位机软件编写容易,但能100%完整地对仪表进行操作;标准读和写指令分别如下:

读取: 地址代号 + 52H(82)+ 要读的参数代号 + 00 + 00 + 校验码

写入: 地址代号 + 43H(67)+ 要写的参数代号 + 写入低字节 + 写入高字节 + 校验码

地址代号:AI仪表有效地址为0-80,协议规定地址代号为两个相同的字节,数值为(仪表地址+80H),如地址为5,那么地址代码将对应85H 85H。

参数代号:参数代号表示各个参数对应的值,这个需要参考协议说明书,下面列举部分参数:

0dd8c51eca21f7210c8c11b77ff0a0d5.png

校验码:校验码采用 16 位求和校验方式。

读指令校验码计算方法为:

要读的参数的代号×256+82+ADDR

写指令校验码计算方法为:

要写的参数代号×256+67+要写的参数值+ADDR

公式中 ADDR为仪表地址,范围是 0~80(注意不要加上 80H)。校验码为2 个字节,其低字节在前,高字节在后。

25ca703f5efc43148db6d6589941b586.png

4、AIBUS通信协议开发

  • 串口通信:在创建好Windows窗体应用后,创建一个类,取名为AIBUS,AIBUS协议基于串口通信,因此首先要实现基本的串口连接与断开,通过调用SerialPort组件实现,代码如下所示:
63b3ad97aecd81a29a226b8040b21080.png
  • 参数封装:每次通信返回结果可能包含很多参数,这里主要获取5个重要的参数,分别是实际值、设定值、参数值、高限报警、低限报警,并将这5个参数封装成一个类,如下所示:
b3c541aa1abe93b7334a49494f9440fe.png
  • 读取参数:参考协议中的读取报文,读取参数将地址代号与参数代号作为参数,然后将返回值解析成一个AIBUSParam对象,如下所示:
319fe7efa34d16b74d7fd9895477644b.png
  • 读取校验:读取校验按照协议进行校验和累加,最终结果转换2个字节返回,如下所示:
eca010e9de9d081e9d419589cd2b98d0.png
  • 解析报文:解析报文首先是判断返回报文校验是否正确,然后按照协议进行解析,返回AIBUSParam对象,如下所示:
a989c343f2fd65e02c64fdb34d5a244f.png
  • 验证报文:验证报文主要是做校验判断,对前面N-2个字节做校验,然后与最后2个字节对比,这样就可以知道报文校验是否正确,如下所示:
e771d535dc83ae876996815891e8b2e4.png
  • 写入参数:参考协议中的读取报文,写入参数将地址代号、参数代号与参数值作为参数,返回值仍然解析成一个AIBUSParam对象,如下所示:
d6608dca1a32968eb508a1be13c0cbac.png
  • 写入校验:写入校验按照协议进行校验和累加,最终结果转换2个字节返回,如下所示:
77a833c0b546e02004b8d1e3fc1252f8.png

5、温度监控系统TMS上位机开发

通信库编程完成后,就可以进行上位机开发,本上位机系统主要是实时采集三个不同地点的温度,通过实时曲线进行显示并存储到数据库,便于后续分析。

UI界面设计如下所示:

7cdf20a58eecbaa769e4464497caa4e4.png

上位机开发主要包括以下几部分:

1、配置信息管理:配置信息主要包括通信端口号、波特率、仪表1地址代号、仪表2地址代号、仪表3地址代号等,这里采用ini的方式进行存储,通过调用底层API的方式读取配置信息,封装成对象。ini文件存储形式如下所示:

54025866df7ebbe9f03144b5c7491880.png

2、读取配置文件代码如下:

85e9b47fb611bf80f9117f28e86a0e3c.png

3、实时日志显示:系统运行过程中的各种状态都将通过日志的形式进行展示,这里采用ListView+委托的方式来实现,代码如下所示:

e158f6d50ae5ef1cdcdf70c16e5ff556.png

4、实时读取及显示:实时读取采用的是多线程的方式,通过读取错误次数来判断读取异常,从而实现自动断线重连。

5、实时数据存储:实时数据存储采用SQLite数据库,通过开启一个线程定时器,按照1秒的频率定时向数据库中存储数据,便于后续查询。

最终上位机运行结果如下所示:

d3fd06faacee119e4384b25145c27dad.png

6、整体总结

本文主要是结合宇电智能温度控制器,通过对其通信协议的分析,开发出对应的通信库,从而实现上位机监控系统开发。在上位机学习过程中,看懂协议、分析协议、开发协议及应用协议,都是必备的技能。【公众号dotNet工控上位机:thinger_swj】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断单链表中的元素是否递增_检测单链表中是否有环(C语言)

检测单链表中是否有环(C语言)方法:双指针法思路使用两个指针,两个初始时都指向链表的头结点,然后one指针一次加一,另一个two指针一次加二。在链表有环时,two指针与one指针相等就说明有环。当one指针到达环的起始位置时…

cad 怎么显示块句柄_cad怎么显示工具栏

大家使用电脑时可能会出现一些小问题,比如cad菜单栏不见了,怎样全屏显示等等问题,有时候不小心操作,导致问题的出现,cad怎么显示工具栏?cad怎么显示工具栏方法一、使用天正自带内部命令步骤1、在最下方的【命令栏】中…

Java 第16章 坦克大战1-2 思路整理

文章目录 1 绘制坦克坦克画板Panel画框Frame 2 让坦克动起来画板Panel 1 绘制坦克 坦克 不同坦克有共同属性,可以先提取共同特征(坐标位置)作为父类,然后其他坦克类继承它。 画板Panel 有坦克在画板上显示,所以包含…

java object转泛型_为什么Java的泛型要用擦除实现

在 Java 中的 泛型 ,常常被称之为 伪泛型 ,究其原因是因为在实际代码的运行中,将实际类型参数的信息擦除掉了 (Type Erasure) 。那是什么原因导致了 Java 做出这种妥协的呢?下面我就带着大家以 Java 语言设计者的角度,…

java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程

java lambda函数“ Java SE 8新功能浏览 ”系列的这篇文章将深入了解Lambda表达式 。 我将向您展示Lambda表达式的几种不同用法。 它们都具有功能接口的共同实现。 我将解释编译器如何从代码中推断信息,例如特定类型的变量以及后台实际发生的情况。 在上一篇文章“…

Apache Camel 3.1 –更多骆驼核心优化(第2部分)

我以前曾在博客中介绍我们在下一个Camel 3.1版本(第1部分)中所做的优化 。 今天,我想发布大约4周后的最新状态更新。 我们集中在三个方面优化骆驼核心: 不必要的对象分配 不必要的方法调用 提高绩效 换句话说,我…

计算机系统的指令系统,计算机指令系统指的是什么呢?

2014-12-27计算机系统的指令由你哪两部分组成?共作用分别是什么?1。8086汇编语言指令由标号、操作码、操作数和注释组成,其中标号和注释可以省略,操作码指出指令要过盛的功能,操作数指出完成的对象。2。变量和标号的区别是变量由伪指令定义&a…

echarts怎么保存图片到剪切板上_在电脑上怎么批量给图片编号以及怎么自动记录记事本txt文档时间...

电脑日益成为我们日常办公不可或缺的工具,除了必要的软件使用之外,也有一些直到今天还不那么为人所熟知的小技巧。而小编今天就暂时为大家介绍两个颇为常用的小技巧~分别是如何将图片批量编号以及自动记录记事本时间。技巧一、图片批量编号旅行或者活动结…

计算机类qq网名,最帅的qq名字

qq这个聊天工具已经成为人们电脑里必备的软件,上到40~50的叔叔阿姨,下至8~9岁的小学生,都有qq这个聊天工具。qq是有可以随意改名字的功能,最长可以输入十几个字符作为名字。就是因为取名没有太多的限制,反而让人不知道…

c++中求解非线性方程组_齐次线性方程组的基础解系的简便算法

线性方程组的求解是线性代数中的基本技能,而齐次线性方程组的基础解系的求法又是基础。本文给出一个计算齐次线性方程组的基础解系的公式,从而简化计算过程。01 符号说明 n元线性方程组的矩阵形式:(1)齐次线性方程组;(2)非齐次线性方程组;系数…

python的if语句例句_Python入门之if条件语句

Besides the while statement just introduced, Python knows the usual control flow statements known from other languages, with some twists.除了之前介绍的while语句,Python同样支持其他语言通常用的控制流语句,但也有一些区别。 if Statements P…

esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...

2.FREERTOS任务创建、内核链表初始化硬件环境:cortex m4FreeRTOS版本:v8.0.1今天开始阅读freertos,阅读同时做下笔记,等哪天碰到移植问题再翻出来看看。2.1 任务、链表结构体源码中使用tskTCB来存储一个任务的所有信息,xLIST存储内…

Sigma IDE现在支持Python无服务器Lambda函数!

想想无服务器,使用Pythonic –全部在您的浏览器中! (好吧,这则新闻已经过了几周了,但是仍然……) 如果您沉迷于整个无服务器的“事物”中 ,您可能已经注意到我们,一个在SLAppForge臭…

idle不是python自带的开发工具_Python的开发工具

通常情况下,为了提高开发效率,需要使用相应的开发工具。进行Python开发也可以使用开发工具。下面将详细介绍Python自带的IDLE 一使用自带的IDLE 在安装Python后,会自动安装一个IDLE。它是一个Python shell(可以在打开的IDLE窗口的标题栏上看到…

java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化

java se 导原码我很自豪,像其他专业团队成员一样,是采用OpenJDK的成员之一,但是从过去8个月就加入了,我们经历了Java SE 8 开发,编译,编码,讨论等各个阶段,直到将其付诸实践为止。 。…

linux将日期和日历信息追加到文件中_Linux任务调度

crontab 任务调度crontab 进行定时任务的设置概述 任务调度:是指系统在某个时间执行的特定的命令或程序。任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等 。2.个别用户工作:个别用户可能希望…

android sdk build-tools_从零开始仿写一个抖音App——视频编辑SDK开发(一)

本文首发于微信公众号——世界上有意思的事,搬运转载请注明出处,否则将追究版权责任。交流qq群:859640274。大家好久不见,又有一个多月没有发文章了。不知道还有哪些读者记得我的 从零开始仿写抖音App 的系列文章,这个…

爱默生E系列服务器机柜托盘,艾默生通信电源PS48300-3B/1800 一体化室内机柜

PS48300-3B/1800电源系统PS48300-3B/1800电源系统是艾默生网络能源集多年开发和网上运行经验,采用 DSP控制技术,为满足3G网络需求而设计的高可靠、高功率密度、高性能、全数 字化通信电源系统。根据交流配电和机柜高度。一、特点 1、休眠节能专利技术&am…

功能Java示例 第8部分–更多纯函数

这是第8部分,该系列的最后一部分称为“ Functional Java by Example”。 我在本系列的每个部分中发展的示例是某种“提要处理程序”,用于处理文档。 在上一期文章中,我们已经使用Vavr库看到了一些模式匹配,并且还将故障也视为数据…

tensorflow 小于_坐姿不对,屏幕就变模糊!教你用TensorFlow做一款“隐形背背佳”...

大数据文摘出品作为一个上班族,每天坐在电脑前那么久,难免出现腰酸背痛的情况,时间长了甚至脊柱都歪曲变形了,这可不行!一定要克制住自己的坐姿。这里有款“隐形背背佳”,要不要了解一下?一位名…