中控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进行更多的操作,比如说调用一些复杂的模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值