中控SCADA使用vbs调用python

利用中控SCADA中的VBS脚本实现数据记录并调用python进行额外的计算功能。

记录随机数并提取某两个时间节点的随机数进行相加操作后,由SCADA的定时器触发读取操作,让数据流回组态

步骤

1.使用vbs每隔一段时间创建一个收集到数据的json文件,这里称为json1

2.在调用两个时间节点数据前先创建一个有两个时间节点信息的json文件,这里称为json2

3.使用vbs调用python(用按钮也行,定时器也行)

4.python通过json2内的信息确认所要读取的两个文件的名字

5.python自己发挥自己想干嘛就干嘛的想法。

6python制作txt文件(中控SCADA的vbs脚本没有解析json的能力)

7利用中控SCADA写入节点数据的代码接入数据

详细

1.使用vbs每隔一段时间创建一个收集到数据的json文件

定时器触发

        

vbs代码1:

Sub Timer1_OnTimer()
	call build_json ()
End Sub

build_json()这个是个自定义函数

vbs代码2:

sub build_json ()
	dim fso,testfile
	year_time=Year(Now)
	month_time=Month(Now)
	day_time=Day(Now)
	hour_time=Hour(Now)
	minute_time=Minute(Now)
	val0=app.ReadTag("Random_numbers_0")
	val1=app.ReadTag("Random_numbers_1")
	val2=app.ReadTag("Random_numbers_2")
	val3=app.ReadTag("Random_numbers_3")
	val4=app.ReadTag("Random_numbers_4")
	val5=app.ReadTag("Random_numbers_5")
	val6=app.ReadTag("Random_numbers_6")
	val7=app.ReadTag("Random_numbers_7")
	val8=app.ReadTag("Random_numbers_8")
	val9=app.ReadTag("Random_numbers_9")
	set fso = createobject("scripting.filesystemobject")  
	set testfile = fso.createtextfile("E:\SCADA\"&year_time&"_"&month_time&"_"&day_time&"_"&hour_time&"_"&minute_time&".json",true) 
	testfile.writeline("{""Random_numbers_0"": "&val0&"," & _
	" ""Random_numbers_1"": "&val1&"," & _
	" ""Random_numbers_2"": "&val2&"," & _
	" ""Random_numbers_3"": "&val3&"," & _
	" ""Random_numbers_4"": "&val4&"," & _
	" ""Random_numbers_5"": "&val5&"," & _
	" ""Random_numbers_6"": "&val6&"," & _
	" ""Random_numbers_7"": "&val7&"," & _
	" ""Random_numbers_8"": "&val8&"," & _
	" ""Random_numbers_9"": "&val9&"}" )  
	testfile.close
end sub

val0~9都是读取SCADA内节点的数据生成一个名为年_月_日_时_分.json的文件

Random_numbers_0 是SCADA数据库节点(自己定义名字的)

2.在调用两个时间节点数据前先创建一个有两个时间节点信息的json文件,这里称为json2

创建一个按钮作为触发标志。(你要是愿意你也能用定时器触发)

vbs代码3:

Sub Button2_OnLButtonDown(nFlag, x, y)
	call build_timejson()
End Sub

输入你要读取的两个时间点:年、月、日、时、分

build_timejson() 是个自定义函数,当按钮按下时创建json文件

vbs代码4

sub build_timejson ()
	dim fso1,testfile1
	val0=app.ReadTag("year1")
	val1=app.ReadTag("month1")
	val2=app.ReadTag("day1")
	val3=app.ReadTag("hour1")
	val4=app.ReadTag("minute1")
	val5=app.ReadTag("year2")
	val6=app.ReadTag("month2")
	val7=app.ReadTag("day2")
	val8=app.ReadTag("hour2")
	val9=app.ReadTag("minute2")
	val10 = app.ReadTag("year1")
	set fso1 = createobject("scripting.filesystemobject")  
	set testfile1 = fso1.createtextfile("E:\SCADA\time_operation.json" , true) 
	testfile1.writeline("{""year1"": "&val0&"," & _
	" ""month1"": "&val1&"," & _
	" ""day1"": "&val2&"," & _
	" ""hour1"": "&val3&"," & _
	" ""minute1"": "&val4&"," & _
	" ""year2"": "&val5&"," & _
	" ""month2"": "&val6&"," & _
	" ""day2"": "&val7&"," & _
	" ""hour2"": "&val8&"," & _
	" ""minute2"": "&val9&"," & _
	" ""Random_numbers_9"": "&val9&"}" )
	testfile1.close
end sub

3.使用vbs调用python(用按钮也行,定时器也行)

通过上文的运行按钮,当按钮抬起来时执行调用python的代码

vbs代码5

Sub Button2_OnLButtonUp(nFlag, x, y)
	call run_python()
End Sub

run_python()也是一个自定义函数

vbs代码6

sub run_python ()
	Set objshell = CreateObject("Wscript.shell")
	strPythonScript="F:\桌面\程序\SCADA项目\解析计算.py"
	objshell.Run strPythonScript , true
end sub

地址就是.py文件的路径,随便放反正能找到这文件就行。

4.python通过json2内的信息确认所要读取的两个文件的名字

python代码1

def act3_txt1(address,number):
    file = open(address, 'r')
    content = file.read()
    data=json.loads(content)
    file.close()
    if(data['year1']!=0 and data['month1']!=0  and data['day1']!=0 ):
        if(data['year2']!=0 and data['month2']!=0 and data['day2']!=0):
            if(number==1):
                file_name="{}_{}_{}_{}_{}.json".format (data['year1'],data['month1'],data['day1'],data['hour1'],data['minute1'])
            elif (number==2):
                file_name="{}_{}_{}_{}_{}.json".format (data['year2'],data['month2'],data['day2'],data['hour2'],data['minute2'])
        else:
            file_name=None
    else:
        file_name=None
    return file_name

通过这样的操作得出两个时间节点的文件名字file_name。

5.python自己发挥自己想干嘛就干嘛的想法。

python代码2:把该时间点的数据提取出来

if __name__=='__main__':
    jsonfile_time = 'E:/SCADA/time_operation.json'
    jsonfile_path1 = 'E:/SCADA/{}'.format (act3_txt1(jsonfile_time,1))   #json1文件绝对地址
    jsonfile_path2 = 'E:/SCADA/{}'.format (act3_txt1(jsonfile_time,2))   #json2文件绝对地址
    a='Random_numbers_4'
    b='Random_numbers_5'
    f1=open(r'E:\SCADA\text.txt','w')           #清空文件(打开不写数据就是清空)
    f1.close()
    f1=open(r'E:\SCADA\text.txt','w')           #打开文件
    if(act3_txt1(jsonfile_time,1)==None):
        f1.write('0')
    else:
        params_1=act_json1(jsonfile_path1,a)    #提取时间点1的数据 a=key
        params_2=act_json1(jsonfile_path2,b)    #提取时间点2的数据 b=key
        params_3=(params_1+params_2)            #运算,各位随便改
        params_4=str(params_3)                  #写入txt文件需要改成字符串形式。
        f1.write(params_4)                      #写入txt文件
    f1.close()                                  #关闭文件

jsonfile_path1和jsonfile_path2是两个json文件绝对地址

调用 act_json1 来实现数据的提取

python代码3

def act_json1(address,key_name):
    file = open(address, 'r')  #打开指定目录下json文件
    content = file.read()   #读取json对象
    data = json.loads(content)  #转换成字典对象
    file.close()            #关闭json文件
    data1=data[key_name]                #读取字典中的值
    return data1            #返回值

6python制作txt文件(中控SCADA的vbs脚本没有解析json的能力)

    f1=open(r'E:\SCADA\text.txt','w')           #清空文件(打开不写数据就是清空)
    f1.close()
    f1=open(r'E:\SCADA\text.txt','w')           #打开文件
    if(act3_txt1(jsonfile_time,1)==None):
        f1.write('0')
    else:
        params_1=act_json1(jsonfile_path1,a)    #提取时间点1的数据 a=key
        params_2=act_json1(jsonfile_path2,b)    #提取时间点2的数据 b=key
        params_3=(params_1+params_2)            #运算,各位随便改
        params_4=str(params_3)                  #写入txt文件需要改成字符串形式。
        f1.write(params_4)                      #写入txt文件
    f1.close()                                  #关闭文件

7利用中控SCADA写入节点数据的代码接入数据

制作一个定时器触发

vbs程序7 定时器触发读取操作

Sub Timer2_OnTimer()
	call read_txt ()
End Sub

vbs程序8  read_txt

sub read_txt ()
	dim fso, f,i
	set fso = CreateObject("Scripting.FileSystemObject")
	set f = fso.OpenTextFile("E:\SCADA\text.txt", 1, false) '第二个参数 1 表示只读打开,第三个参数表示目标文件不存在时是否创建
	i=f.ReadAll() '从当前位置向后读取,直到文件结束,并将当前位置移动到文件的最后
	f.close
	z=cdbl (i)
	app.WriteTag("return"), z
end sub
app.WriteTag("return"), z

这一段是SCADA内的写操作,把Z写入节点tag “return”

到此完成所有操作。

得益于中控SCADA有5w的免费节点所以可以为所欲为。

        记录数据也可以利用中控SCADA中的报表功能来实现数据的存储,不过那东西不够灵活所以就没有考虑进来,利用excel和python也能很方便地对数据进行操作就是了。

        利用这个操作也可以调用python进行更多的操作,比如说调用一些复杂的模型。

<think>好的,我现在需要帮助用户了解中控SCADA系统的相关信息,包括其介绍、架构和功能。首先,我需要回忆一下中控集团在工业自动化领域的背景。中控(SUPCON)是中国领先的自动化与信息化技术提供商,他们的SCADA系统主要用于工业过程监控和数据采集。 接下来,用户提到的参考引用中有关于SCADA系统的架构、与其他系统(如DCS、PLC)的协同工作,以及调试运行的信息。我需要将这些内容与中控的具体情况结合起来。比如,引用[1]提到SCADA通过连接制造堆栈的上下层组件,这可能对应中控系统的分层架构。 关于架构部分,通常SCADA系统分为数据采集层、通信网络层和监控管理层。根据引用[5],硬件设备包括下位机控制器、I/O模块等,这些应该属于数据采集层。中控的架构可能类似,但需要具体说明各层的组件,比如使用哪些控制器或通信协议。 功能方面,引用[3]提到标签数据库、点或标签的数据元素,中控SCADA应该具备实时数据采集、报警管理、历史数据存储、人机界面和报表功能。同时,引用[2]指出SCADA与DCS、PLC协同工作,可能需要说明中控系统如何集成这些设备。 还需要注意用户提供的引用[4]提到的开源SCADA平台,但中控的系统可能不是开源的,所以需要区分。另外,引用[5]详细描述了硬件和软件调试过程,这可能涉及到中控系统的实施和运维阶段。 需要确保回答结构清晰,分点介绍介绍、架构、功能,并且在最后生成相关问题。同时,引用标注要正确,如引用[1]、[2]等,并自然融入内容中。最后检查是否符合LaTeX格式要求,数学表达式是否正确使用$...$或$$...$$,以及使用中文回答。</think>### 中控SCADA系统介绍、架构与功能 #### 1. 系统简介 中控(SUPCON)SCADA系统是中国领先的工业自动化解决方案之一,专注于实时数据采集、过程监控及生产管理。其核心目标是通过集成硬件与软件,实现对工业设备、工艺流程的全方位监控与优化,广泛应用于石油、化工、电力、市政等领域[^3][^4]。系统支持分布式数据库(“标签数据库”),管理大量数据点(如传感器输入、控制输出),并通过软硬件协同确保高可靠性与实时性[^3][^5]。 --- #### 2. 系统架构 中控SCADA系统采用典型的分层架构,主要分为以下三层: - **数据采集层** 包含现场仪表(如压力变送器、温度传感器)、PLC(可编程逻辑控制器)及RTU(远程终端单元),负责实时采集设备状态与工艺参数。硬件模块(如I/O模块、通信模块)需通过严格调试确保精度与功能正常。 - **通信网络层** 支持工业以太网、Modbus、OPC UA等协议,实现数据从现场到监控中心的可靠传输。中控系统通常集成冗余网络设计,避免单点故障影响生产[^1][^2]。 - **监控管理层** 包括上位机(HMI人机界面)、服务器及数据库,提供数据可视化、报警管理、历史存储等功能。中控SCADA还可与MES(制造执行系统)、ERP(企业资源计划)集成,形成工厂级信息化管理[^1][^4]。 $$ \text{系统架构模型:} \quad \text{数据采集层} \xrightarrow{\text{通信网络}} \text{监控管理层} $$ --- #### 3. 核心功能 - **实时监控与数据采集** 通过标签(Tag)管理数万点数据,支持对流量、温度、压力等参数的实时显示与记录。 - **报警与事件管理** 自定义阈值触发报警,记录事件日志并推送至操作员界面,确保快速响应异常工况。 - **历史数据存储与分析** 内置时序数据库,支持长期数据存储及趋势分析,为工艺优化提供依据。 - **人机交互(HMI)** 提供图形化界面,动态展示工艺流程、设备状态及控制操作,降低运维复杂度。 - **冗余与安全机制** 采用双机热备、权限分级等设计,保障系统高可用性与信息安全[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值