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 data

data = 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 ")
            break
        else:
            print("device ",name , remark)          #控制台打印
            structId=structId+1                     #结构变量id增加1
            deviceName='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 :                           #直接跳过空行,提升效率
        continue
    if 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导入,完事。不过强烈建议导入之前,对项目进行备份,万一出问题,后悔来得及。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)定于2024年12月27-29日在中国厦门举行。会议旨在为从事“人工智能、机器人和通信”研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,了解学术发展趋势&#xf…

TCRT5000红外循迹传感器指南

开始先发送红外线 当返回的红外线的信号量小于规定值时,D0输出0,反之输出1 黑色的物体吸收红外光比其他物体多,所以检测到黑色物体D0会输出0,可以以此来循迹 逆时针调节电位器可以使得规定值上升,需要接受更多信号才能输出1 顺…

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

有关后代选择器的具体解释&#xff1a; 后代选择器 后代选择器使用时&#xff0c;需要以空格将多个选择器间隔开。 比如&#xff0c;这里p span&#xff0c;表示只设置p元素内&#xff0c;span元素的样式。 <style> /* 使用后代选择器设置样式 */ p span { …

大数据-184 Elasticsearch - 原理剖析 - DocValues 机制原理 压缩与禁用

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

数字后端零基础入门系列 | Innovus零基础LAB学习Day4

Module 10 利用Global Router来分析设计是否可绕通 LAB10-1 跑一个placement 本章节目的是load进一个floorplan&#xff0c;跑通一个placement并完成post-placement的timing优化 导入设计和floorplan 这步之前的lab已经做过了&#xff0c;大家再按照下面的步骤再练习巩固下…

信息安全工程师(62)网络蠕虫分析与防护

网络蠕虫分析 网络蠕虫是一种智能化、自动化&#xff0c;综合了网络攻击、密码学和计算机病毒技术的恶意程序或代码&#xff0c;它无须计算机使用者干预即可运行。这种蠕虫能够扫描和攻击网络上存在系统漏洞的节点主机&#xff0c;并通过局域网或国际互联网从一个节点传播到另一…

【UE5】通过程序化网格体组件实现剖切功能

效果 步骤 1. 新建两个Actor类蓝图&#xff0c;分别命名为“BP_CutActor”、“BP_CutPlane”&#xff0c;分别表示被剖切的网格体和剖切的片面。 2. 打开“BP_CutActor”&#xff08;被剖切的网格体&#xff09;&#xff0c;添加静态网格体组件、程序化网格体组件&#xff0c;…

(三)第一个Qt程序“Qt版本的HelloWorld”

一、随记 我们在学习编程语言的时候&#xff0c;各种讲解编程语言的书籍中通常都会以一个非常经典的“HelloWorld”程序展开详细讲解。程序虽然简短&#xff0c;但是“麻雀虽小&#xff0c;五脏俱全”&#xff0c;但是却非常适合用来熟悉程序结构、规范&#xff0c;快速形成对编…

原型模式和建造模式的区别

原型模式&#xff08;Prototype Pattern&#xff09;和建造者模式&#xff08;Builder Pattern&#xff09;虽然都是创建型设计模式&#xff0c;但它们的应用场景和实现方式有着显著的区别。以下是二者的详细对比&#xff1a; 1. 意图和应用场景 原型模式&#xff1a; 意图&a…

【论文阅读】2022 TChecker Precise Static Inter-Procedural Analysis for Detecting

总览 “TChecker: Precise Static Inter - Procedural Analysis for Detecting Taint - Style Vulnerabilities in PHP Applications” 由香港中文大学的 Changhua Luo、Penghui Li 和 Wei Meng 撰写。论文介绍了 TChecker 工具&#xff0c;用于检测 PHP 应用中的污点式漏洞&am…

【Linux】为什么环境变量具有全局性?共享?写时拷贝优化?

环境变量表具有全局性的原因&#xff1a; 环境变量表之所以具有全局性的特征&#xff0c;主要是因为它们是在进程上下文中维护的&#xff0c;并且在大多数操作系统中&#xff0c;当一个进程创建另一个进程&#xff08;即父进程创建子进程&#xff09;时&#xff0c;子进程会继承…

动态路由:RIP实验

1.划分IP 2.配置环回 3.接口配置IP地址 4.进入RIP中&#xff0c;关闭手工汇总&#xff0c;选择版本号&#xff0c;宣告 5.ping命令查看是否全网通 6.在R3上配置缺省路由 [R3-rip-1]default-route originate 在边界路由器上下发缺省 7.为了安全配置手工认证 [R1-Gigab…

qt QVariant详解

QVariant是Qt框架中一个功能强大的变体类&#xff0c;它提供了一种通用的方式来存储Qt对象及其他类的值&#xff0c;能够以类似于指针的方式存储任意类型的值。 一、 主要特性 通用性&#xff1a;QVariant可以存储几乎所有数据类型&#xff0c;包括基本数据类型&#xff08;如…

刷题小记9:回溯

回溯算法模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理…

html+vue实现动态复杂table

1、效果 2、代码 <div style"overflow: scroll; width: 100%;height: calc(100% - 80px);"><table class"table table-bordered" style"width: auto;table-layout: fixed;"><thead style"position: sticky;top: -1px;z-inde…

【C++干货篇】——类和对象的魅力(四)

【C干货篇】——类和对象的魅力&#xff08;四&#xff09; 1.取地址运算符的重载 1.1const 成员函数 将const修饰的成员函数称之为const成员函数&#xff0c;const修饰成员函数放到成员函数参数列表的后面。const实际修饰该成员函数隐含的this指针&#xff08;this指向的对…

IDEA如何查看所有的断点(Breakpoints)并关闭

前言 我们在使用IDEA开发Java应用时&#xff0c;基本上都需要进行打断点的操作&#xff0c;这方便我们排查BUG&#xff0c;也方便我们查看设计的是否正确。 不过有时候&#xff0c;我们不希望进入断点&#xff0c;这时候除了点击断点关闭外&#xff0c;有没有更快速的方便关闭…

深入浅出剖析重量级文生图模型Flux.1

24年8月&#xff0c;Flux.1的发布又一次火爆整个AI绘图领域&#xff0c; 号称AI文生图的“新标杆”&#xff0c;刷新AI图像领域的新格局。 Flux是一款由Black Forest Labs开发的尖端AI图像生成工具&#xff0c;旨在通过先进的技术将文本提示转化为高质量的图像。Flux AI支持多…

利用 OBS 推送 WEBRTC 流到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…

总分441数一149专137东南大学820信号数电考研经验电子信息与通信工程电路原920专业基础综合,真题,大纲,参考书。

一. 写在前面的话 本人是23年考生&#xff0c;本科就读于西电电子信息工程&#xff0c;以441分总分&#xff08;数学一149&#xff0c;英语83&#xff0c;专业课820&#xff08;原920信号和数电专业基础综合&#xff09;137&#xff0c;政治73&#xff09;考上东南信院电路与系…