DCS项目调试踩坑记录

        最近在调试一个DCS项目(集散控制系统),实际上就是一个新建厂区的控制系统。PLC用的是西门子1500,控制画面使用组态王7.5。

        在调试过程中,发现给西门子DB块的变量转移到组态王太难了,因此记录一下,有需要的朋友可以参考我的做法,我这做法不一定是最简单的方法,如果哪个大神有更简单的方法,麻烦请告知一下。

        首先介绍一下DCS系统。DCS系统基本包含下面几个部分:

        1:设备部分,包含工厂生产需要的设备,以及设备的运转所需要的配电箱。设备的配电箱一般包含控制器(就是PLC,用来对设备本身运转做控制),传感器,变频器,等等。
        如果没有DCS系统,在条件具备的情况下,也是可以由工人在控制箱上按按钮来控制设备。但是很明显现场让工人控制设备明显不太可行,因为设备太多,距离太远,突发情况根本来不及控制。

        2:总控部分,就是在现有设备基础上,增加一层控制器,这一层控制器负责接入具体设备的配电箱,来代替人工在箱子上按按钮,以及读取设备的状态。也可以实现一定的逻辑判断,可以根据条件将多个连锁设备一同开启或者关闭。

        3:中控部分,这一部分,就说开发一个控制画面,从总控PLC里面读取全厂设备状态,以及实现在中控室对全厂设备进行控制。

        DCS系统大致结构图如下。中控和几个配电室组成一个环网,需要专门的环网交换机,环网的好处是中间断一下不影响。比如中间某个配电室突然断电,不影响其他。

         DCS系统里面,设备本身的控制逻辑,在设备随机的控制器都已经做好了,这个是设备厂家做的,一般也不对外开放。控制箱保留一些控制接口(如硬接线,485,网口等)。

        总控PLC一般是需要根据特定的场景和需求来进行编程。这个编程大致的意思,就是在什么情况下,启动某个设备。在什么情况下关闭某些设备。

        最后是中控画面控制总控PLC,从而达到控制全厂设备的目的。

        那么,中控是怎么控制PLC呢,答案很简单,就是通过修改PLC内部的变量(实际上就是内plc的内存,内存连续存了很多变量,short,float,bool,int 等)。PLC一般对外提供通讯协议,让上位机软件来读取和修改内部变量。例如西门子的S7协议,modbus_rtu,modbus_tcp,can,等等。

        中控画面要修改PLC内部的变量,就需要要在组态软件知道plc内部变量的地址,因为变量太多,一般情况下,都是几千个变量起步,如果地址没有对上,中控点击启动,可能会产生严重后果。所以对变量是一个体力活。

        这里要吐槽的第一点就是博图(西门子PLC编程软件)居然没有办法把DB块导出到excel,来方便其他组态工具导入变量。但是博图可以打印DB块到PDF。

        吐槽的第二点:组态王导出结构体变量居然报错。见下图:

 再咨询过组态王技术以后,技术表示不支持导出结构变量,也不支持导入结构变量。但是我PLC里面全是结构变量。因为结构变量用起来更方便,不容易记错。

不过技术说可以通过另外一种方法,就是再工程管理界面,导入和导出DB。如下图:

 导出的DB内容如下。这个要注意,组态王导出和导入,调用的excel,如果电脑上没有安装excel,这个功能是没法用。安装wps也不行。强烈建议组态王支持国产,支持wps。

 有了这个文件,剩下的就是想办法把博图导出的变量表(PDF文件见下图),按照这个格式转换一下。

当然直接读取PDF是不太可行的,不过WPS可以将PDF转换成excel,只要不是图片版的excel就行。刚刚这个就不是图片。所以还得是WPS帮忙。转换为excel见下图。看起来还是有点乱,不过不影响。

有了DB格式文件,有了excel,那剩下的就简单了。上py代码:

##############################################################
# 用于将博图DB块里面批量定义的结构体,转换为组态王格式,方便导入  #
# 博图DB块需要先打印成PDF,然后再用WPS将PDF转换为excel          #
#  qujia 20241022                                            #
##############################################################import pandas as pd             #用于读取excel,如果没有需要pip install pands
from openpyxl import Workbook   #用于写入excel,如果没有需要pip install openpyxl
#定义db块中,需要被导入的变量名称,下面的下标一一对应
keys = ['bStart','bStop','StartAllowed','StopAllowed','rPinlv_Geiding','rPinlv_Geiding_A','MA','bReset','EM','bOpen','bClose','bStop','bOpen_A','bClose_A','bStop_A']
#定义在组态王中,结构体的变量名称,与上面的下标一一对应
names=['启动','停止','启动许可','停止许可','手动频率','自动频率','模式','复位','急停','手动开','手动关','手动停','自动开','自动关','自动停']def read_xlsx(file_path):                  #读取excel文件,返回一个集合df = pd.read_excel(file_path)           data = df.values.tolist()return datadata = read_xlsx('plc2write.xlsx')           #读取excel文件,这个文件是pdf转的
wb =Workbook()                              #用于导出excel文件
st1 = wb.create_sheet('结构体变量')          #结构体变量sheet
stInt = wb.create_sheet('基本变量_IO整数')   #整数变量表单
stFloat=wb.create_sheet('基本变量_IO实数')   #实数变量的表单
stBit=wb.create_sheet('基本变量_IO离散')     #bit变量表单
structId = 153                                #当前结构变量id,当前最大的编号
varId=1383                                    #当前基本变量id,当前最大的编号
deviceName=''                               #当前设备名称,结构体名称
dbName='DB6.'                             #DB块名称
structName='设备控制'                       #结构体名称
plcName='筛分站PLC'                         #plc名称
for r in data :name=r[1]                               #名称type=r[4]                               #类型add=r[6]                                #地址remark=r[17]                            #备注信息#print(name,type)if type == 'Struct' :                   #如果是Struct ,可能是结构体开头if name.find('Static') !=-1:        #如果是没有名字的设备,直接结束#print(r)print("end ")breakelse:print("device ",name , remark)          #控制台打印structId=structId+1                     #结构变量id增加1deviceName='W'+name.replace('-','_')    #结构名称转变一下,符合组态王规则structName='设备控制'                       #结构体名称if deviceName.find('A_VA')>=0  or deviceName.find('A_GA')>=0:structName='阀门控制'                   #结构体名称st1.append(['[结构变量]','变量ID','变量名','变量类型','变量使用记数','注释'])   #输出结构变量标题st1.append(['',structId,	deviceName,	structName,	0,	remark])        #输出结构变量名称和备注st1.append(['','[成员]','成员名称','成员基本变量ID','',''])	                  #输出成员变量标题continue                            #继续下一行if name == None :                           #直接跳过空行,提升效率continueif type=='Bool' and add==int(add):          #如果是bool类型,并且是***.0,excel里面会把.0去掉,这里再加上去add=dbName+str(add)+".0"else :add= dbName+str(add)if name in keys :                           #如果是目标变量remark=remark[0:35]                     #注释不能太长,组态王最大支持40个字符idx=keys.index(name)                    #根据名称,对应组态王里面属性名称vname=deviceName+"."+names[idx]         #根据名称,对应组态王里面属性名称if structName=='阀门控制' and name=='bStop' :vname=deviceName+'.手动停'print(name,vname,type,add,remark)       #输出到控制台varId=varId+1                           #基本变量编号增加一个st1.append(['','',vname,varId,'',''])   #结构体添加变量引用if type=='Int' :                        #输出到整数表单stInt.append([varId,vname,0,0,0,0,999999999	,0,999999999,'否','否',	plcName,add,'USHORT','只写',1000,'线性','无','','','','否','',1,'','','','','','','','','','','','','','','','','','','不记录','','','否','无',remark,144,''])elif type=='DInt':                      #输出到整数表单stInt.append([varId,vname,0,0,0,0,999999999	,0,999999999,'否','否',plcName,add,'LONG','只写',1000,'线性','无','','','','否','',1,'','','','','','','','','','','','','','','','','','','不记录','','','否','无',remark,144,''])elif type=='Real':                      #输出到浮点数表单stFloat.append([varId,vname,0,0,0,0,999999999,0,999999999,'否','否',plcName,add,'FLOAT','只写',1000,'线性','无','','','','否','',1,'','','','','','','','','','','','','','','','','','','不记录','','','否','无',remark,144,''])elif type=='Bool':                      #输出到bit类型表单stBit.append([varId,vname,0,'关','否','否',plcName,	add,'Bit','只写',1000,'否','',1,'否','','','','','','','','不记录','','否','无',remark,144,''])wb.save('write2.xlsx')                             #写入目标文件

 最后生成的变量表文件,直接贴进去,然后DB导入,完事。不过强烈建议导入之前,对项目进行备份,万一出问题,后悔来得及。

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

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

相关文章

【设计模式-我的思考】套餐模式

imom排故下线-订单状态集查询功能实现(套餐模式) 需求描述 排故下线状态 不排故:未启用排故下线确认配置&订单状态参数值!(170、180、190) 待排故:启用排故下线确认配置&排故下线确认未执行&订单状态参数…

Spire.PDF for .NET【页面设置】演示:在 C# 中应用 PDF 页面转换

当您在导出为 PDF 格式的文档中翻页时,页面过渡会显示装饰效果,例如溶解或擦除。当您以 PDF 格式创建幻灯片时,页面过渡特别有用。Spire.PDF是一款专为开发人员设计的强大 .NET 组件,可让您将页面过渡应用于 PDF 文件。 这里介绍…

vue3学习记录-组件通信

vue3学习记录-组件通信 1.父子组件通信2.兄弟组件传值2.1 以父组件为媒介2.2 发布订阅模式2.3 使用mitt2.3.1 全局使用2.3.2 局部使用 1.父子组件通信 父组件&#xff1a; <template>父组件原有的title:{{ title }}<p>---</p><com :title"title&qu…

MyBatis入门之一对一关联关系(示例)

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版&#xff09;》(杨章伟&#xff0c;刘祥淼)【摘要 书评 试读】- 京东图书 …

FreeRTOS实时操作系统(1)

前言&#xff1a;FreeRTOS内容较多&#xff0c;分篇发布&#xff0c;较为基础&#xff0c;旨在梳理知识&#xff0c;适合入门的同学 &#xff08;基于正点原子STM32F103开发板V2&#xff09; &#xff08;对于本篇&#xff0c;若有疑问&#xff0c;欢迎在评论区留言&#…

Wooden UI(木头UI纹理按钮边框 背景图标 带PNG素材)

资源包包含以下元素&#xff1a;按钮、图标、框架、复选框等&#xff0c;提供分层的 PSD 文件。 下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

橡皮鸭调试法(Rubber Duck Debugging)

橡皮鸭调试法&#xff08;Rubber Duck Debugging&#xff09;是一种编程中的调试技巧&#xff0c;名字来源于一本书《The Pragmatic Programmer》&#xff0c;其中提到程序员可以把问题讲给一只橡皮鸭听&#xff0c;以便在讲解的过程中梳理思路并找到问题的根源。 基本原理&am…

微服务基础架构(图)

微服务基础架构是一种现代化的软件架构模式&#xff0c;旨在将大型复杂的应用程序拆分为多个小型、独立的服务。每个微服务专注于特定的业务功能&#xff0c;可独立开发、部署和扩展。 在微服务基础架构中&#xff0c;通常会使用轻量级的通信机制&#xff0c;如 RESTful API 或…

RISC-V笔记——RVWMO基本体

1. 前言 RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering)&#xff0c;它是Release Consistency的扩展&#xff0c;因此&#xff0c;RVWMO的基本特性类似于RC模型。 2. RC模型 Release consistency(RC)的提出是基于一个观察&#xff1a;将所有同步操作用FENCE围在一…

升级Unity后产生的Objects内存泄露现象

1&#xff09;升级Unity后产生的Objects内存泄露现象 2&#xff09;能否使用OnDemandRendering API来显示帧率 3&#xff09;Unity闪退问题 4&#xff09;配置表堆内存如何优化 这是第405篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答…

PHP 8.1.0-dev后门远程命令执行漏洞

#简介 PHP verion 8.1.0-dev于2021年3月28日与后门一起发布&#xff0c;但是后门很快被发现并删除。 #漏洞概述 PHP verion 8.1.0-dev的PHP在服务器上运行&#xff0c;则攻击者可以通过发送User-Agentt标头执行任意代码。 #影响版本 PHP 8.1.0-dev #环境搭建 新建docker…

LLM之RAG实战(四十四)| rag-chatbot:支持Huggingface和Ollama任意模型的多PDF本地RAG方案

特点&#xff1a; 支持本地运行和Kaggle (new)运行支持Huggingface 和Ollama 的任意模型Process multiple PDF inputs.Chat with multiples languages (Coming soon).Simple UI with Gradio. 一、安装使用 1.1 Kaggle&#xff08;推荐&#xff09; Step1&#xff1a;把https…

Android 10.0 Camera2 拍照镜像功能实现

1.前言 在10.0的系统rom定制化开发中,在进行camera2的相关拍照功能开发中,在某些时候会遇到拍照照片 左右镜像的问题,就是照片左半边和右半边是反的,所以就需要在拍照的时候保存图片的时候实现 左右镜像功能,接下来就来分析下拍照保存图片的流程 2.Camera2 拍照镜像功能实…

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作&#xff0c;它提供了一种优雅而简单的方法&#xff0c;将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过&#xff0c;有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的&#xff0c;通过包…

图片无损放大工具Topaz Gigapixel AI v7.4.4 绿色版

Topaz A.I. Gigapixel是这款功能齐全的图象无损变大运用&#xff0c;应用可将智能机拍摄的图象也可以有着专业相机的高质量大尺寸作用。你可以完美地放大你的小照片并大规模打印&#xff0c;它根本不会粘贴。它具有清晰的效果和完美的品质。 借助AIGigapixel&#xff0c;您可以…

[Linux网络编程]01-网络基础

此部分为《计算机网络》理论基础&#xff0c;可简要了解 一.计算机网络体系结构 常见的体系结构 OSI体系结构(法律上的国际标准)&#xff1a;物理层->数据链路层->网络层->运输层->会话层->表示层->应用层 TCP/IP体系结构(事实上的国际标准)&#xff1a;…

web网页QQ登录

代码&#xff1a; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>QQ登录ent</title> </head> <style>ul > li{list-style: none; } a …

13.1 Linux_网络编程_TCP/UDP

字节序 1、概述 什么是字节序&#xff1a; 字节序就是字节的存储顺序&#xff0c;分为大端字节序和小端字节序。 大端字节序&#xff1a;低地址存高位&#xff08;网络&#xff09;小端字节序&#xff1a;低地址存低位&#xff08;主机&#xff09; 检验主机字节序模式&…

【Linux】-权限

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;深入代码世界&#xff0c;了解掌握 Linux 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ​ 一、权限的概念 在Linux 中&…

开源图像超分ECBSR项目源码分析

相关介绍 项目GitHub地址&#xff1a;https://github.com/xindongzhang/ECBSR项目相关论文&#xff1a;https://www4.comp.polyu.edu.hk/~cslzhang/paper/MM21_ECBSR.pdf&#xff08;也可以点这里下载&#xff09;论文解读&#xff1a;Edge-oriented Convolution Block for Re…