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