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.rhkb.cn/news/454143.html

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

相关文章

RHCE【远程连接服务器】

目录 一、远程连接服务器简介 二、加密技术简介 SSH工作过程: (1)版本协商阶段 (2)密钥和算法协商阶段 (3)认证阶段 (4)会话请求阶段 (5&#xff0…

互联网人口红利趋缓下的社群粉丝经济新模式探索

摘要:随着互联网人口红利消失近十年,国内互联网人口红利爆发时期凭借大量用户取得成功的模式不再适用。如今互联网人口增长进入平缓期,社群粉丝经济成为新方向。其能借助人群画像精准推送营销信息,降低成本。如“21 链动模式 AI 智…

android openGL ES详解——混合

一、混合概念 混合是一种常用的技巧,通常可以用来实现半透明。但其实它也是十分灵活的,你可以通过不同的设置得到不同的混合结果,产生一些有趣或者奇怪的图象。混合是什么呢?混合就是把两种颜色混在一起。具体一点,就…

【前端】如何制作一个自己的网页(16)

上次,我们学习了两种复合CSS选择器,以及两种内容分组的方式:整体布局的div元素和局部布局的span元素。 学习目标 学习另一种对内容分组的方式:列表结构。首先,我们会简单了解下什么是HTML的列表结构。然后&#xff0…

《深度学习》YOLO v1网络架构 、损失值、NMS极大值抑制

目录 一、Yolo系列v1 1、核心思想 2、示例 3、流程图解析 二、YOLO系列v1损失函数 1、位置误差 2、置信度误差 3、类别概率损失 三、NMS非极大值抑制 1、概念 2、步骤 四、YOLO v1优缺点 1、优点 1)速度快 2)端到端 3)多尺度…

Python 学习笔记(十二)—— 网络编程

目录 一、网络编程的基本概念 1.1 IP地址 1.1.1 IP的版本 1.1.2 IP的分类 1.1.2.1 公有地址 1.1.2.2 私有地址 1.1.3 IP地址的范围 1.1.4 回环测试 1.2 常见的网络设备 1.3 端口 1.3.1 端口分配 二、网络通信协议 2.1 常用网络协议 2.2 OSI网络协议七层模型 2.3…

Java访问修饰符private,default,protected,public

在Java中,访问修饰符决定了类、方法、变量和构造器的可见性和可访问范围。这里有四个主要的访问修饰符:private、default(未显式指定)、protected 和 public。下面分别解释它们的作用: 1.private 作用:使…

【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数

引言 拷贝构造函数是C中一个重要的特性,它允许一个对象通过另一个已创建好的同类型对象来初始化。 了解拷贝构造函数的概念、作用、特点、规则、默认行为以及如何自定义实现,对于编写健壮和高效的C程序至关重要。 C类和对象系列文章,可点击下…

Vue+ECharts+iView实现大数据可视化大屏模板

Vue数据可视化 三个大屏模板 样式还是比较全的 包括世界地图、中国地图、canvas转盘等 项目演示: 视频: vue大数据可视化大屏模板

java多态

1 final 关键字 final关键可以用来修饰变量、成员方法以及类。 1.1. 修饰变量或字段,表示常量(即不能修改) 2. 修饰类:表示此类不能被继承 我们平时是用的 String 字符串类, 就是用 final 修饰的, 不能被继承. 3. 修饰方法:表示该方法不能…

Excel重新踩坑3:条件格式;基本公式运算符;公式中的单元格引用方式;公式菜单栏其他有用的功能说明;

0、前言:以下内容是学习excel公式的基础内容。 1、需求:将表格特定区域中数值大小大于等于30,小于等于80的单元格,颜色填充为红色,大于80的,颜色填充为黄色。 新建规则之后也可以通过该功能清除规则。 2、基…

使用InternVL、LMDeploy和GTE搭建多模态RAG系统

如何将视觉大模型(VLM)与 多模态RAG 结合起来,创建服装搜索和搭配推荐!本文展示了InternVL模型在分析服装图像和提取颜色、款式和类型等关键特征方面的强大功能。 InternVL2是国内首个在MMMU(多学科问答)上突破60的模型&#xff0…

一次使用LD_DEBUG定位问题的经历

在实际工作中,当遇到段错误,我们会很容易的想到这是非法访问内存导致的,比如访问了已经释放的内存,访问数据越界,尝试写没有写权限的内存等。使用gdb进行调试,查看出异常的调用栈,往往可以定位到…

告别装机烦恼,IT小白到IT大神都在用的免费神器

作为USB启动盘制作工具中的佼佼者,Rufus凭借其卓越的性能和实用性,赢得了众多用户的信赖。这款精巧的实用程序不仅能够将系统ISO镜像完美转换为可引导的USB安装介质,还提供了全面的USB设备管理功能。 Rufus的安装包仅有1.5M大小,…

ubuntu系统库和Anaconda库冲突问题

之前安装opencv时没出现过这种问题,自从安装Anaconda后就总遇到问题。记录下自己的解决过程。 目录 第一步 第二步 第三步 安装opencv时出现以下问题: /usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_prep_cif@LIBFFI_BASE_7.…

qt QTableview 左侧 序号 倒序

本文主要在QTableview插入数据的基础上,使左边序号实现倒序,实现如下图所示。 解决办法: QTableview左侧是QHeaderView类构成的,重写QHeaderView的paintSection, 重写序号的文字内容,进而 实现QTableview …

FFT过程中自动补零,补零部分FFT结果不为零

在 FFT(快速傅里叶变换) 中,补零(Zero Padding)是为了使信号的点数符合 2 的幂次方,以提高 FFT 的计算效率。然而,即使你对信号进行了补零,FFT 计算后在补零部分可能会得到复数结果不…

医院信息化与智能化系统(5)

医院信息化与智能化系统(5) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应的…

python 文件防感染扫描

一、安装 首先,你需要安装 secplugs-python-client 库。你可以通过 pip 命令来安装: pip install secplugs-python-client确保你的 Python 环境已经正确设置,并且网络连接畅通,以便能够顺利安装。 二、基本用法 1. 初始化客户…

nosql课本习题

nosql题目 1. 文档数据库相比其他 NoSQL 的突出优势和特点是什么? 答案: 文档数据库的突出优势在于它的灵活性和可扩展性。不同于传统的关系型数据库,文档数据库允许存储半结构化和非结构化数据,每个文档可以有不同的字段&#x…