WinCC脚本案例保留

WinCC脚本案例保留
WinCC脚本案例保留

WinCC脚本案例保留

2010-09-16 16:44

最近做一个WinCC跟ERP通讯的一个小项目,将脚本语言保留下来,以备不时之需!

仅仅是保留,各位看官如发现不妥之处请加以指教.

1.通过扫描枪扫描到ID号传给PLC,WinCC读取到ID号从ERP数据库中查找相关数据,写回到PLC,并给PLC一个写完成确认信号.(数据库是SqlServer2000)

Dim DB240trigger,db241trigger

db240trigger=HMIRuntime.Tags("db240itrigger").Read

db241trigger=HMIRuntime.Tags("DB241itrigger").Read

Dim ss,str

str=HMIRuntime.Tags("DB240szcoil_ID").Read

ss=CStr(str)

If (db240trigger=1 And db241trigger=0 ) Then

Dim sPro,sDsn,sSer,sCon,sSql

Dim oRsMaterial,conn,oCom,oItem,oRsSCHEMA

Dim database,server,uid,pwd

sCon ="driver=sql server;server=10.51.103.96;DATABASE=brgs_release;uid=sa;pwd=pasword"

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

conn.Open

Set oRsMaterial = CreateObject("ADODB.Recordset")

sSql= "SELECT * FROM dbo.BRGS_GP_Material where MkNo='" & CStr(ss) & "'"

oRsMaterial.open ssql,conn,1,1

Dim m,n

m=oRsMaterial.recordcount

If m<>1 Then

MsgBox "这个ID号找不到唯一的一条参数信息,请手动输入信息!"

Exit Function

End If

Dim sCon2,sSql2

Dim oRsnftz,conn2

sCon2="driver=sql server;server=10.51.103.115;DATABASE=db_01;uid=sa;pwd=12345"

Set conn2 = CreateObject("ADODB.Connection")

conn2.ConnectionString = sCon2

conn2.Open

Dim LAST

LAST=orsMaterial.fields("LastProcedure").value

LAST=LAST+1

Set oRsnftz = CreateObject("ADODB.Recordset")

sSql2= "SELECT * FROM MF_TZ where ZC_ITM=" & CInt(LAST) & " And MO_No='" & orsMaterial.fields("MO_NO").value & "'" oRsnftz.open ssql2,conn2,1,1

Dim GJID,PIHAO,PANHAO,GANGZHONG,ZHIJING,ZHONGLIANG,P

Dim PP

PP=oRsnftz.fields("ZC_NO").value

If (Left(PP,1) = "P") Then

HMIRuntime.Trace "P"

HMIRuntime.Tags("visible_error").Write 0,1

Else

HMIRuntime.Trace "not p ,will exit!"

HMIRuntime.Tags("DB241szCOIL_ID").Write "error state",1

HMIRuntime.Tags("error_text").Write PP,1

HMIRuntime.Tags("visible_error").Write 1,1

MsgBox "该材料现在不在P处理模式,请核实,或者手动输入信息!"

Exit Function

End If

GJID=HMIRuntime.Tags("DB240szcoil_ID").Read

PIHAO=orsMaterial.fields("Mo_No").value

PANHAO=orsMaterial.fields("Plant_No").value

GANGZHONG=orsMaterial.fields("Snm").value

ZHIJING=orsMaterial.fields("CardSPC").value

ZHONGLIANG=orsMaterial.fields("CurrentWeight").value

HMIRuntime.Tags("DB241iProg_NO").Write P,1

HMIRuntime.Tags("DB241rDiameter").Write ZHIJING,1

HMIRuntime.Tags("DB241rWeight").Write ZHONGLIANG,1

HMIRuntime.Tags("DB241szSTEELGRADE").Write GANGZHONG,1

HMIRuntime.Tags("DB241szPRODUNCTION_NO").Write PIHAO,1

HMIRuntime.Tags("DB241szCOIL_NO").Write PANHAO ,1

HMIRuntime.Tags("DB241szCOIL_ID").Write GJID,1

HMIRuntime.Tags("DB241itrigger").Write 1,1

oRsMaterial.Close

Set oRsMaterial = Nothing

oRsnftz.Close

Set oRsnftz = Nothing

conn.Close

Set conn = Nothing

conn2.Close

Set conn2 = Nothing

End If

2.开始上料程序

PLC接受到上料按钮的命令,将处理数据传给相应的DB数据块,并产生一条开始处理记录.插入到ERP的数据库中.

Dim a,b,c,d,itrigger1,itrigger2

itrigger1=HMIRuntime.Tags("DB242itrigger").Read

itrigger2=HMIRuntime.Tags("DB243itrigger").Read

If (itrigger1=1 And itrigger2<>1 ) Then

a=HMIRuntime.Tags("DB242szCOIL_ID1").Read

b=HMIRuntime.Tags("DB242szCOIL_ID2").Read

c=HMIRuntime.Tags("DB242szCOIL_ID3").Read

d=HMIRuntime.Tags("DB242szCOIL_ID4").Read

HMIRuntime.Tags("DB243szCOIL_ID1").Write a,1

HMIRuntime.Tags("DB243szCOIL_ID2").Write b,1

HMIRuntime.Tags("DB243szCOIL_ID3").Write c,1

HMIRuntime.Tags("DB243szCOIL_ID4").Write d,1

HMIRuntime.Tags("DB243itrigger").Write 1,1

End If

/////插入记录的程序

Dim sPro,sDsn,sSer,sCon,sSql

Dim oRsMaterial,conn,conn2,oCom,oItem,oRsSCHEMA

Dim database,server,uid,pwd

Dim ss,str

str=HMIRuntime.Tags("MKNO").Read

ss=CStr(str)

Dim lianjiezifuchuan,shujuku,shanchusql

lianjiezifuchuan ="driver=sql server;server=127.0.0.1\WINCC;DATABASE=Master;uid=;pwd="

Set shujuku = CreateObject("ADODB.Connection")

shujuku.ConnectionString = lianjiezifuchuan

shujuku.Open

shanchusql= "Delete from load_unload WHERE shangxia=1 and MkNo='"& ss &"'"

Dim mingling

Set mingling =CreateObject("https://www.360docs.net/doc/376432523.html,mand")

With mingling

.ActiveConnection=shujuku

.ComMandText=shanchusql

End With

mingling.Execute

Set mingling=Nothing

shujuku.Close

Set shujuku = Nothing

If (ss<> "" )Then

'sCon ="driver=sql server;server=10.51.103.96;DATABASE=brgs_release;uid=sa;pwd=pasword"

sCon ="driver=sql server;server=PC-201003161557\WINCC;DATABASE=brgs_release;uid=sa;pwd=123456" Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

conn.Open

Set oRsMaterial = CreateObject("ADODB.Recordset")

sSql= "SELECT * FROM dbo.BRGS_GP_Material where mkNo='" & CStr(ss) & "'"

oRsMaterial.open ssql,conn,1,1

Dim mm

mm= oRsMaterial.recordcount

If mm<1 Then

MsgBox "条码"& sS & "查询不到相关的数据,请检查"

Exit Sub

End If

If mm>1 Then

MsgBox "条码"& sS & "查询到相关的数据不止一条,请检查"

Exit Sub

End If

Dim STRState

STRState=oRsMaterial.fields("MaterialState").value

If STRState<>20 Then

MsgBox "条码"& sS & "查询到的材料状态不是20,请检查!"

Exit Sub

End If

Dim intlastprocedure,intlastprocedure2,cailiaohao

intlastprocedure=orsMaterial.fields("LastProcedure").value

intlastprocedure2=intlastprocedure+1

cailiaohao=orsMaterial.fields("Material_No").value

Set conn2 = CreateObject("ADODB.Connection")

conn2.ConnectionString = sCon

conn2.Open

sSql= "SELECT * FROM dbo.BRGS_GP_SCHEMA where UseFlag=0 and MkSeq= " & intlastprocedure2 & " And Material_NO='" & CStr(cailiaohao) & "'"

Set oRsSCHEMA = CreateObject("ADODB.Recordset")

oRsSCHEMA.open ssql,conn2,1,1

Dim n

n=oRsSCHEMA.recordcount

If n>1 Then

MsgBox "条码"& sS & "查询到的调度信息不止一条,请检查"

Exit Sub

End If

If n<1 Then

MsgBox "条码"& sS & "查询不到调度信息,请检查"

Exit Sub

End If

Dim gonghao,banzu,shike

gonghao=HMIRuntime.Tags("gonghao").Read

banzu=HMIRuntime.Tags("banzu").Read

shike=HMIRuntime.Tags("shike").Read

Dim s1,s2,s3,s4,s5,s6,s7

Dim A1,A2,A3,A4,A5,A6,A7,A8,A9,A10

Dim A11,A12,A13,A14,A15,A16,A17,A18,A19,A20

Dim A21,A22,A23,A24,A25,A26,A27,A28,A29,A30

Dim A31,A32,A33,A34,A35,A36,A37,A38,A39,A40

A1=orsMaterial.fields("Material_No").value ''引用自BRGS_GP_Material表

A2=orsMaterial.fields("Plant_No").value ''从BRGS_GP_MATERIAL表中Plant_No中复制过来

A3=orsMaterial.fields("Stuff_No").value ''从BRGS_GP_MATERIAL表中Stuff_no中复制过来

A4=orsMaterial.fields("MaterialPre_No").value ''从BRGS_GP_MATERIAL表中MaterialPre_No中复制过来

A28=orsMaterial.fields("BfNo").value ''从BRGS_GP_MATERIAL表中Bf_No中复制过来

A20=orsMaterial.fields("MkNo").value ''这个就是条码上的内容//////这个要确定

A5=orsMaterial.fields("Snm").value ''钢种,从BRGS_GP_MATERIAL表中Snm中复制过来

A29=orsMaterial.fields("FirstSPC").value ''原料规格,从BRGS_GP_MATERIAL表中FirstSPC中复制过来

A30=orsMaterial.fields("CardSPC").value ''开工时的标称规格,从BRGS_GP_MATERIAL表中CardSPC中复制过来

A31=orsMaterial.fields("CardSPC").value ''完工时的标称规格,从BRGS_GP_MATERIAL表中CardSPC中复制过来

A32=orsMaterial.fields("RealSPC").value ''开工时的实测规格,从BRGS_GP_MATERIAL表中RealSPC中复制过来

A33=orsMaterial.fields("RealSPC").value ''完工时的实测规格,从BRGS_GP_MATERIAL表中RealSPC中复制过来

A7=orsMaterial.fields("Mo_No").value ''制令单号,从BRGS_GP_MATERIAL表中Mo_No中复制过来

'''''''''''''''''''''''''''''''

'''''''from schema table'''''''

'''''''''''''''''''''''''''''''

A8=oRsSCHEMA.fields("SUnit").value ''制程代码,从BRGS_GP_SCHEMA表中的SUnit读取

A9=oRsSCHEMA.fields("TzNo").value ''通知单号,从BRGS_GP_SCHEMA表中的TzNo读取

A10=oRsSCHEMA.fields("ZcNo").value ''制程名称,从BRGS_GP_SCHEMA表中的ZcNo读取

A11=oRsSCHEMA.fields("ZcRem").value ''制程说明,从BRGS_GP_SCHEMA表中的ZcRem读取

A21=oRsSCHEMA.fields("SUnit").value ''计划机台,从BRGS_GP_SCHEMA表中的SUnit读取

A37=oRsSCHEMA.fields("rowid").value ''调度号,对应BRGS_GP_SCHEMA中的主键,表明本次操作,对应那一个调度

A12="401202J" ''工作的机组,对于自动酸洗线是401202J

A34="" ''拉丝模具号,这里为空字符串

A35="" ''酸洗的吊钩号,这里为空A13=1 ''始终为1

A14=CStr(shike) ''开工时间

A15=CStr(gonghao) ''开工操作员工号

A16="" ''完工时间

A17="99999" ''完工操作员工号

A25=CStr(banzu) ''开工的班组

A27="" ''完工的班组

A19=0 ''切头切尾量,不理会,设置为0

A22=1 ''质检标志,永远为1

A23="system" ''质检人员,永远为System

A24="" ''质检时间,与完工时间一致,暂时未空

A36=21 ''工序的类型,对于酸洗,永远是21

A38=0 ''在插入时设置为0,后面的操作不要更动这个字段

A40="" ''在插入时设置为空串,后面的操作不要更动这个字段

A39=0 ''设置为0

A6="" ''未作说明,设置为0

A18=0 ''ENDWEIGHT

A26=0 ''BeginWeight

sSql= "insert into BRGS_GP_PROCEDURE values(133,'" & A1 & "','" & A2 & "','" & A3 & "','" & A4 & "','" & A5 & "','" & A6 & "','" & A7 & "','" & A8 & "','" & A9 & "','" & A10 & "','" & A11 & "','" & A12 & "',"& CInt(A13) &",'" & CStr(A14)& "','" & A15 & "','" & CStr(A16)& "','" & A17 & "',"& CInt(A13) &","& CInt(A19) &",'" & A20 & "','" & A21 & "',"& CInt(A22) &",'" & A23 & "','" & CStr("")& "',N'" & A25 & "',"& CInt(A26) &",'" & A27 & "','" & A28 & "','" & A29 & "','" & A30 & "','" & A31 & "','" & A32 & "','" & A33 & "','" & A34 & "','" & A35 & "',"& CInt(A36) &","& CInt(A37) &"," & A38 & "," & A39 & ",'" & A40 & "')"

Dim objCommand

Set objCommand=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

With objCommand

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand.Execute

Dim objCommand2

Set objCommand2=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

sSql= "update dbo.BRGS_GP_Material set MaterialState='22',Region='401202J',LastProcedure=" & intlastprocedure2 & " where mkNo='" & CStr(ss) & "'"

With objCommand2

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand2.Execute

Dim objCommand3

Set objCommand3=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

sSql= "update dbo.BRGS_GP_SCHEMA set UseFlag=1 where UseFlag=0 and MkSeq= " & intlastprocedure2 & " And Material_NO='" & CStr(cailiaohao) & "'"

With objCommand3

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand3.Execute

Set objCommand=Nothing

Set objCommand2=Nothing

Set objCommand3=Nothing

oRsMaterial.Close

Set oRsMaterial = Nothing

oRsSCHEMA.Close

Set oRsSCHEMA = Nothing

conn.Close

Set conn = Nothing

End If

3.下料程序

PLC接收到下料按钮的信号,更新ERP数据库中的信息,并将相关的ID号回传做二次对比.

Dim a,b,c,d,itrigger1,itrigger2

Dim id2

itrigger1=HMIRuntime.Tags("DB244itrigger").Read

itrigger2=HMIRuntime.Tags("DB245itrigger").Read

If (itrigger1=1 And itrigger2<>1 And id2=0) Then

a=HMIRuntime.Tags("DB244szCOIL_ID1").Read

b=HMIRuntime.Tags("DB244szCOIL_ID2").Read

c=HMIRuntime.Tags("DB244szCOIL_ID3").Read

d=HMIRuntime.Tags("DB244szCOIL_ID4").Read

HMIRuntime.Tags("DB245szCOIL_ID1").Write a,1

HMIRuntime.Tags("DB245szCOIL_ID2").Write b,1

HMIRuntime.Tags("DB245szCOIL_ID3").Write c,1

HMIRuntime.Tags("DB245szCOIL_ID4").Write d,1

HMIRuntime.Tags("DB245itrigger").Write 1,1

End If

/////更新ERP中相关的数据

Dim sPro,sDsn,sSer,sCon,sSql

Dim oRsMaterial,conn,conn2,oCom,oItem,oRsSCHEMA

Dim database,server,uid,pwd

Dim ss,str

str=HMIRuntime.Tags("MKNO").Read

ss=CStr(str)

Dim lianjiezifuchuan,shujuku,shanchusql

lianjiezifuchuan ="driver=sql server;server=127.0.0.1\WINCC;DATABASE=Master;uid=;pwd="

Set shujuku = CreateObject("ADODB.Connection")

shujuku.ConnectionString = lianjiezifuchuan

shujuku.Open

shanchusql= "Delete from load_unload WHERE shangxia=2 and MkNo='"& ss &"'"

Dim mingling

Set mingling =CreateObject("https://www.360docs.net/doc/376432523.html,mand")

With mingling

.ActiveConnection=shujuku

.ComMandText=shanchusql

End With

mingling.Execute

Set mingling=Nothing

shujuku.Close

Set shujuku = Nothing

If (ss<> "") Then

'sCon ="driver=sql server;server=10.51.103.96;DATABASE=brgs_release;uid=sa;pwd=password"

sCon ="driver=sql server;server=PC-201003161557\WINCC;DATABASE=brgs_release;uid=sa;pwd=123456"

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

conn.Open

Dim gonghao,banzu,shike

gonghao=HMIRuntime.Tags("gonghao").Read

banzu=HMIRuntime.Tags("banzu").Read

shike=HMIRuntime.Tags("shike").Read

Dim objCommand

Set objCommand=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

sSql= "update dbo.BRGS_GP_PROCEDURE set QCTime='" & CStr(shike)& "', EndTime='" & CStr(shike) & "',EndEmpNo='"& CStr(gonghao) & "',EndShift='"& CStr(banzu) & "' where endempno='99999' and mkNo='" & CStr(ss) & "'"

With objCommand

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand.Execute

Set oRsMaterial = CreateObject("ADODB.Recordset")

sSql= "SELECT * FROM dbo.BRGS_GP_Material where mkNo='" & CStr(ss) & "'"

oRsMaterial.open ssql,conn,1,1

Dim mm

mm= oRsMaterial.recordcount

If mm<=0 Then

MsgBox "下料的扫描号码为"& str & "没有在数据库中找到上料信息"

Exit Sub

End If

Dim intlastprocedure,intlastprocedure2,cailiaohao

intlastprocedure=orsMaterial.fields("LastProcedure").value

intlastprocedure2=intlastprocedure+1

cailiaohao=orsMaterial.fields("Material_No").value

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Set conn2 = CreateObject("ADODB.Connection")

conn2.ConnectionString = sCon

conn2.Open

sSql= "SELECT * FROM dbo.BRGS_GP_SCHEMA where UseFlag=0 and MkSeq= " & intlastprocedure2 & " And Material_NO='" & CStr(cailiaohao) & "'"

Set oRsSCHEMA = CreateObject("ADODB.Recordset")

oRsSCHEMA.open ssql,conn2,1,1

Dim n

n=oRsSCHEMA.recordcount

If n>1 Then

MsgBox "调度表中关于条码" & ss &"的数据大于一条,请检查"

Exit Sub

End If

Dim sql_last,rst_last,x_last,xxx

x_last=0

sql_last= "SELECT * FROM dbo.BRGS_GP_SCHEMA where MkSeq>= " & intlastprocedure2 & " And Material_NO='" &

CStr(cailiaohao) & "' order by mkseq asc"

Set rst_last = CreateObject("ADODB.Recordset")

rst_last.open sql_last,conn2,1,1

xxx=rst_last.recordcount

If xxx=0 Then

x_last=100

Else

rst_last.movefirst

End If

Dim y

Do While (Not rst_last.eof)

If rst_last.fields("UseFlag").value=0 Then

y=100

rst_last.movenext

End If

rst_last.movenext

Loop

x_last=y-x_last

Dim strzctype,zctypewrite

strzctype=oRsSCHEMA.fields("ZcType").value

If strzctype=21 Then

zctypewrite=20

End If

If strzctype=22 Then

zctypewrite=40

End If

If strzctype=23 Then

zctypewrite=30

End If

If x_last=100 Then

zctypewrite=50

End If

Dim objCommand2

Set objCommand2=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

sSql= "update dbo.BRGS_GP_Material set Region='BLQ',MaterialState=" & CStr(zctypewrite) & " where mkNo='" & CStr(ss) & "'"

With objCommand2

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand2.Execute

If x_last=100 Then

Dim objCommand3

Set objCommand3=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

sSql= "update dbo.BRGS_GP_Material set IsProduct=1,ProductShift='" & CStr(banzu)& "',ProductMan='" &

CStr(gonghao)& "',ProductTime='" & CStr(shike)& "',MaterialState=" & CStr(zctypewrite) & " where mkNo='" & CStr(ss) & "'"

With objCommand3

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand3.Execute

End If

Set objCommand=Nothing

Set objCommand2=Nothing

Set objCommand3=Nothing

rst_last.close

Set rst_last=Nothing

oRsMaterial.Close

Set oRsMaterial = Nothing

oRsSCHEMA.Close

Set oRsSCHEMA = Nothing

conn.Close

Set conn = Nothing

End If

4.缓冲信息

系统具备多个上料按钮,也就是说操作人员按下每个上料按钮的时间很短,而处理上料这块的程序又比较大,根据网络情况,有时候需要1分钟左右,这样,有可能会丢失信息,这个是不允许的,因为信息丢失后,在ERP中就反应不出来,材料的状态就不会发生改变,到下一步工序时,材料就没有办法进行处理,同样下料也是.

所以我做了一个缓冲数据库,.按下上料或者下料按钮时,缓冲数据库只记录上料时的ID号,班组号以及上料时间等简单数据.然后系统定时(1分钟)从缓冲数据库中取出一个最先插入的数据进行处理,更具ID号跟ERP进行通讯,处理相关程序,这样做到了异步处理(一个上料处理到下料的过程需要30分钟左右).

/////上料插入程序,使用本机自带的SqlServer2000数据库

Dim conn,scon,ssql

Dim database,server,uid,pwd

Dim ss1,ss2,ss3,ss4,str1,str2,str3,str4

Dim id1

Dim uesr,banzu

uesr=HMIRuntime.Tags("uesr").Read

banzu=HMIRuntime.Tags("banzu").Read

id1=HMIRuntime.Tags("ID1").Read

str1=HMIRuntime.Tags("DB242szCOIL_ID1").Read

str2=HMIRuntime.Tags("DB242szCOIL_ID2").Read

str3=HMIRuntime.Tags("DB242szCOIL_ID3").Read

str4=HMIRuntime.Tags("DB242szCOIL_ID4").Read

ss1=CStr(str1)

ss2=CStr(str2)

ss3=CStr(str3)

ss4=CStr(str4)

sCon ="driver=sql server;server=127.0.0.1\WINCC;DATABASE=Master;uid=;pwd="

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

conn.Open

Dim A1,A2,A3

If (ss1<> "" And id1=0 )Then

A1=ss1

A2=1 ''1:load 2:unload

A3=CStr(Now())

sSql= "insert into load_unload values('" & A1 & "'," & A2 & ",'" & uesr &"',N'"& banzu &"','" & A3 & "')"

Dim objCommand1

Set objCommand1=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

With objCommand1

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand1.Execute

Set objCommand1=Nothing

End If

If (ss2<> "" And id1=0 )Then

..............

End If

If (ss3<> "" And id1=0 )Then

.........

End If

If (ss2<> "" And id1=0 )Then

..........

End If

conn.Close

Set conn = Nothing

HMIRuntime.Tags("ID1").Write 1,1

/////下料插入程序,使用本机自带的SqlServer2000数据库

Dim conn,scon,ssql

Dim database,server,uid,pwd

Dim ss1,ss2,ss3,ss4,str1,str2,str3,str4

Dim id1

Dim uesr,banzu

uesr=HMIRuntime.Tags("uesr").Read

banzu=HMIRuntime.Tags("banzu").Read

id1=HMIRuntime.Tags("ID2").Read

str1=HMIRuntime.Tags("DB244szCOIL_ID1").Read

str2=HMIRuntime.Tags("DB244szCOIL_ID2").Read

str3=HMIRuntime.Tags("DB244szCOIL_ID3").Read

str4=HMIRuntime.Tags("DB244szCOIL_ID4").Read

ss1=CStr(str1)

ss2=CStr(str2)

ss3=CStr(str3)

ss4=CStr(str4)

sCon ="driver=sql server;server=127.0.0.1\WINCC;DATABASE=Master;uid=;pwd="

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

conn.Open

Dim A1,A2,A3

If (ss1<> "" And id1=0 )Then

A1=ss1

A2=2 ''1:load 2:unload

A3=CStr(Now())

sSql= "insert into load_unload values('" & A1 & "'," & A2 & ",'" & uesr &"',N'"& banzu &"','" & A3 & "')"

Dim objCommand1

Set objCommand1=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

With objCommand1

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand1.Execute

Set objCommand1=Nothing

End If

If (ss2<> "" And id1=0 )Then

.......

End If

If (ss3<> "" And id1=0 )Then

..........

End If

If (ss4<> "" And id1=0 )Then

...............

End If

conn.Close

Set conn = Nothing

HMIRuntime.Tags("ID2").Write 1,1

5.定时一分钟处理的处理

/////具体上料和下料程序就是前面的第一条和第二条

Dim Connectstring,con,rst,sql,rstcount,x,MKNO,gonghao,banzu,shike

ConnectsTring ="driver=sql server;server=127.0.0.1\WINCC;DATABASE=Master;uid=;pwd=" Set con = CreateObject("ADODB.Connection")

con.ConnectionString = connectstring

con.Open

Set rst = CreateObject("ADODB.Recordset")

sql= "SELECT * FROM load_unload order by ID ASC"

rst.open sql,con,1,1

rstcount=rst.recordcount

If (rstcount<1) Then Exit Function End If

rst.movefirst

x=rst.fields("shangxia").value

MKNO=rst.fields("MKNO").value

gonghao=rst.fields("gonghao").value

banzu=rst.fields("banzu").value

shike=CStr(rst.fields("shijian").value)

HMIRuntime.Tags("MKNO").Write MKNO,1

HMIRuntime.Tags("gonghao").Write gonghao,1

HMIRuntime.Tags("banzu").Write banzu,1

HMIRuntime.Tags("shike").Write shike,1

If (x=1) Then

Call procedure1()

End If

'

If (x=2) Then

Call procedure5()

End If

rst.Close

Set rst = Nothing

con.Close

Set con = Nothing

程序的界面就是这么样,很简单,这个一般不需要人去操作,只是换班的时候账号什么的动动就行了,然后上料的时候那个扫描枪扫描条码就可以了,简化了操作人员的劳动强度,以前可是需要操作人员那个条码牌到触摸屏上去一个一个参数输入的哦.

令附一个账号密码的简单程序(不用wincc的,很简单的一个程序,wincc那个设置复杂,维护的人员闲麻烦):

////登陆账号

im ZH,MM,BZ

ZH=HMIRuntime.Tags("ZH").Read

MM=HMIRuntime.Tags("MM").Read

Dim sPro,sDsn,sSer,sCon,sSql

Dim oRs,conn

Dim database,server,uid,pwd

sCon ="driver=sql server;server=127.0.0.1\WINCC;DATABASE=Master;uid=;pwd="

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

conn.Open

Set oRs = CreateObject("ADODB.Recordset")

sSql= "SELECT * FROM mmb where ZH='" & CStr(ZH) & "' And MM='" & CStr(MM) & "'"

oRs.open ssql,conn,1,1

Dim m

m=oRs.recordcount

If m<1 Then

MsgBox "账号或者密码不正确,请重新输入!"

Exit Sub

Dim uesr,banzu

uesr=ors.fields("ZH").value

Dim asd

asd=HMIRuntime.Tags("t").Read

If asd=1 Then banzu="甲班" enD if

If asd=2 Then banzu="乙班" enD if

If asd=4 Then banzu="丙班" enD if

If aSd=8 Then banZu="丁班" enD if

Dim S

S=HMIRuntime.Tags("uesr").Read

If (Left(S,1) = "A") Then

HMIRuntime.Tags("vis").Write 1,1

banZu="管理员"

Else

HMIRuntime.Tags("vis").Write 0,1

End If

HMIRuntime.Tags("uesr").write uesr,1

HMIRuntime.Tags("banzu").write banzu,1

oRs.Close

Set oRs = Nothing

conn.Close

Set conn = Nothing

HMIRuntime.Tags("MM").write "",1

////////增加账号和删除账号的程序

Dim ZH,MM,BZ

ZH=HMIRuntime.Tags("ZH").Read

MM=HMIRuntime.Tags("MM").Read

Dim sPro,sDsn,sSer,sCon,sSql

Dim oRs,conn

Dim database,server,uid,pwd

sCon ="driver=sql server;server=127.0.0.1\WINCC;DATABASE=Master;uid=;pwd="

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

Set oRs = CreateObject("ADODB.Recordset")

sSql= "SELECT * FROM mmb where ZH='" & CStr(ZH) & "'"

oRs.open ssql,conn,1,1

Dim m

m=oRs.recordcount

If m>=1 Then

MsgBox "账号已经存在"

Exit Sub

End If

If ZH="" Then

MsgBox "账号不能为空"

End If

If MM="" Then

MsgBox "密码不能为空"

End If

Dim objCommand3

Set objCommand3=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

sSql= "insert into MMB VALUES('"& ZH & "','" & MM & "')"

With objCommand3

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand3.Execute

Set objCommand3=Nothing

oRs.Close

Set oRs = Nothing

conn.Close

Set conn = Nothing

Dim ZH,MM,BZ

ZH=HMIRuntime.Tags("ZHZH").Read

Dim sPro,sDsn,sSer,sCon,sSql

Dim oRs,conn

Dim database,server,uid,pwd

sCon ="driver=sql server;server=127.0.0.1\WINCC;DATABASE=Master;uid=;pwd="

Set conn = CreateObject("ADODB.Connection")

conn.ConnectionString = sCon

conn.Open

Set oRs = CreateObject("ADODB.Recordset")

sSql= "SELECT * FROM mmb where ZH='" & CStr(ZH) & "'"

oRs.open ssql,conn,1,1

Dim m

m=oRs.recordcount

If m<1 Then

MsgBox "工号不存在"

Exit Sub

End If

Dim objCommand3

Set objCommand3=CreateObject("https://www.360docs.net/doc/376432523.html,mand")

sSql= "delete from MMB where ZH='"& ZH & "'"

With objCommand3

.ActiveConnection=Conn

.ComMandText=ssql

End With

objCommand3.Execute

Set objCommand3=Nothing

Set oRs = Nothing

conn.Close

Set conn = Nothing

HMIRuntime.Tags("ZHZH").Write "",1

wincc 常用脚本

DeactivateRTProject ();//退出系统 #pragma code("useadmin.dll") #include"PWRT_api.h" #pragma code() char* CUser=NULL; CUser=GetTagChar("@CurrentUser"); if (strlen(CUser)==0) { PWRTSilentLogin("operator","123456");//用户“operator",密码"123456”登录} OpenPicture("@MAIN.pdl"); } 在画面中结合不同按钮来组态下面 C 操作 Login Action for login (for example, "mouse click" event): #pragma code ("useadmin.dll") #include "PWRT_api.h" #pragma code() PWRTLogin('c'); Logout Action for logout (for example, "mouse click" event): #pragma code ("useadmin.dll") #include "PWRT_api.h" #pragma code() PWRTLogout(); PWRTLogin 参数必须是CHAR 字符。它指定了显示对话框的监视器。如果只使用一个监视器,那么保留默认参数“c”或者指定“1”。 注意 可以使用PASSLoginDialog 函数来代替PWRTLogin 或者PWRTLogout 函数。这个函数需要和函数PWRTLogin 相同的参数。PWRTLogin 和PASSLoginDialog 函数可以调用登录界面,在上面可以登录或者注销。函数PWRTLogout 被正确执行并且不调用登录界面。 正确执行后这两个函数都返回“1”。然而,登录不会等到显示对话框之后。 注意 如果使用多个显示器,为了能使登录对话框显示在合适的显示器上,需要WinCC Basic Process Control (OS项目编辑器)。 不使用WinCC Basic Process Control 时,可以指定显示器编号,但登录对话框始终显示在第一个显示器上。 #include"apdefap.h"//调用函数代码 void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

Wincc变量记录及报警记录优化

Wincc变量记录及报警记录优化(图) 2010-04-12 18:01 Wincc变量归档(图) 最近在一个项目上,发现Wincc项目运行一段时间后,界面的操作响应变慢了。Wincc运行Runtime 时,发现进度在55%等待时间很长,界面提示为:变量记录管理启动中。怀疑系统运行效率下降和Wincc变量记录有关。 检查变量记录,文件大小为12~20G。咨询西门子工程师,他给出的解决方案是,减小每一个变量归档的大小,减小最长变量归档。具体作法如下: 1.打开Wincc变量记录设定:

2.右击快速归档,打开归档属性:

3.设定单个分段最大大小为:100~200M,单个分段包含的时间段为:1天。这两个参数,以最先达到的为有效; 4.设定所以分段最大尺寸为:10G,最长时间为3个月。这两个参数,以最先达到的为有效; 5.设定归档备份保存位置:选择“备份组态”选项卡,选择“激活备份”,设定目标路径。

5.这里需要注意,当达到记录文件达到10G,或者达到3个月,则Wincc开始了备份。例如达到了3个月,3个月后的第一天,系统将把3个月前的第一天的记录放置到备份数据路径下,并不再连接到数据库上。而新的数据将被保存在ArchiveManager文件夹下,并被连接到数据库上。 6.如果要查询3个月前的数据,则需要在Runtime运行的情况下,打开“变量记录”窗口-》“归档组态”-》右击“快速归档”。快捷菜单中,选择“连接归档”。从备份归档文件夹下,选择要连接的归档文件。 另外,对于报警记录无法自动连接归档的情况,也可以使用6所示方法。 对于报警在报警控件中显示只有1000条的问题。报警控件限制最大报警显示条数为1000条。如果要查询之前的报警,可以使用日期方式,选择要查询的起始和结束日期,进行查询。

WINCC脚本个人经验总结

语音报警的组态 在工业现场安全是极其重要的,无论从那个角度讲我们应该利用一切手段减少故障的发生。在故障已经发生的时候,应该在第一时间以多种方式通知操作人员有故障发生。现代微处理计算机的处理速度可以完全胜任对于图形,语音地同时处理。所以我们可以利用计算机的声卡和音箱在有故障发生的时候产生语言报警,但是问题是WinCC本身并不能产生语音的功能,而且其内部的上千个函数也没有提供处理声音的函数。解决这个问题的方法归功于微软开发的WinCC与操作系统地完美结合,因为在WinCC中可以直接调用Windows的API函数。实现的具体C脚本代码如下: long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { #pragma code(\"Winmm.dll\") void WINAPI PlaySoundA(char *pszSound,char *hmode,DWORD dwflay); #pragma code() if(GetTagBit(\"112排泥备泵故障\")) PlaySoundA(\"d:\\\\\\\\winnt\\\\\\\\media\\\\\\\\Mircosoft sound.wav\",NULL,8); return 1020; }重新启动后,不使用登录窗口如何以一个缺省用户的身份自动登录?怎样确保运行期间有个缺省用户始终处于登入状态?即使另外一个用户已经预先退出。 解答: 重新启动以及在运行期间,您希望HMI系统达到最小的实用性而不使用登录窗口。然而,对于高级操作,登录功能应当保留。此外,如果没有用户登录,则有一个缺省的用户自动登录。缺省用户的权限可以在用户管理器中根据需要设定。 可使用下面的C脚本执行此项功能,请按照下列步骤进行: 将附件中的函数“Silentlogin.pas”复制到项目中的“PAS”子文件夹中。 在项目中选择Global Script > C Editor > Actions > Global Actions并打开全局动作(Global Action)“Silentlogin.pas”。 在“PWRTSilentLogin (“Login”,“Password”);”一行中,用缺省的用户名替换用户“Login”,用缺省用户的口令代替“Password”。 无限循环命令 static int a=0, b=0; if(GetTagBit("BINi_pictu_dyn_09")) { if(b==0) a++; else a--; if(a==7) b=1; if(a==0) b=0; }

wincc功能使用总结

1、Wincc online trend控件实现多条曲线查询 项目要求,查询任意时段内的两条曲线的历史数据 1、首先在变量记录中设置需要记录的变量,如果需要在一个控件内显示两条曲线,做数据 归档时,归档属性最好是一致的,归档属性不一样是否会出现问题,这个没测试,有兴趣的可以测试一下。 2、数据记录设置OK后,新建画面插入online trend控件,我的项目需要把趋势打印出来, 所以把控件的工具栏全部隐藏。 3、双击online trend控件,添加需要显示的归档变量。选择公共X,Y轴等参数。坐标显示 根据自己使用选择,基本上不用设置太多参数。 4、添加需要显示的历史归档变量后,就需要写脚本了,西门子工控网论坛有实例,实例提 示针对于一条曲线时使用,咨询西门子技术支持,如果需要同时显示两条曲线时,需要对两条曲线分别进行设置属性“控件.index=0,1”,但是测试其实只设置index=0的起始及结束时间就OK,就是论坛给的实例不是只针对于一条曲线,两条曲线时同样适用,再多的曲线就没测试了。 5、西门子默认的时间格式为“MM-DD-YYYY HH-MM-SS”格式,所以在设置趋势起始及 结束时间时需要注意。 6、注:导入归档数据需要一定的时间,建议按钮触发。尝试在画面打开时触发脚本,有的 时候会出现历史数据加载不上来。 7、脚本如下,仅供参考 Dim objConnection Dim strConnectionString Dim strSQL Dim objrs Dim chaxun '定义曲线控件 Dim TREND Dim strval_1

Dim strval_2 Dim strval_t1 Dim strval_t2 '初始化程序,省略N行。。。。。。。。。。。。。。。。。。。。。。。。。。。。 '初始化程序,省略N行。。。。。。。。。。。。。。。。。。。。。。。。。。。。 chaxun=HMIRuntime.Tags("管号查询输入").Read strConnectionString = "Provider=MSDASQL;DSN=REPORT;UID=;PWD=;" strSQL = "select * from report where guanhao='"&chaxun&"';" Set objConnection = CreateObject("ADODB.Connection") objConnection.ConnectionString = strConnectionString objConnection.Open Set objrs = CreateObject("ADODB.RecordSet") objrs.open strSQL,objConnection /赋值程序,省略,,,,,,,,,,,,,,,,,,,,,,/ /赋值程序,省略,,,,,,,,,,,,,,,,,,,,,,/ objrs.close Set objrs = Nothing objConnection.Close Set objConnection = Nothing '趋势时间设定 Set trend = ScreenItems("控件1") strval_r=HMIRuntime.Tags("测试日期_read").Read strval_t1=HMIRuntime.Tags("开始时间_read").Read strval_t2=HMIRuntime.Tags("测试时间_read").Read

wincc 常用脚本

D e a c t i v a t e R T P r o j e c t();//退出系统 #pragma code("useadmin.dll") #include"PWRT_api.h" #pragma code() char*CUser=NULL; CUser=GetTagChar("@CurrentUser"); if(strlen(CUser)==0) { PWRTSilentLogin("operator","123456");//用户“operator",密码"123456”登录 } OpenPicture("@MAIN.pdl"); } 在画面中结合不同按钮来组态下面C操作 Login Actionforlogin(forexample,"mouseclick"event): #pragmacode("useadmin.dll") #include"PWRT_api.h" #pragmacode() PWRTLogin('c'); Logout Actionforlogout(forexample,"mouseclick"event): #pragmacode("useadmin.dll") #include"PWRT_api.h" #pragmacode() PWRTLogout(); PWRTLogin参数必须是CHAR字符。它指定了显示对话框的监视器。如果只使用一个监视器,那么保留默认参数“c”或者指定“1”。 注意 可以使用PASSLoginDialog函数来代替PWRTLogin?或者PWRTLogout函数。这个函数需要和函数PWRTLogin相同的参数。PWRTLogin?和PASSLoginDialog函数可以调用登录界面,在上面可以登录或者注销。函数PWRTLogout被正确执行并且不调用登录界面。 正确执行后这两个函数都返回“1”。然而,登录不会等到显示对话框之后。 注意 如果使用多个显示器,为了能使登录对话框显示在合适的显示器上,需要WinCCBasicProcessControl(OS项目编辑器)。

WinCC脚本案例保留

WinCC脚本案例保留 2010-09-16 16:44 最近做一个WinCC跟ERP通讯的一个小项目,将脚本语言保留下来,以备不时之需! 仅仅是保留,各位看官如发现不妥之处请加以指教. 1.通过扫描枪扫描到ID号传给PLC,WinCC读取到ID号从ERP数据库中查找相关数据,写回到PLC,并给PLC一个写完成确认信号.(数据库是SqlServer2000) Dim DB240trigger,db241trigger db240trigger=HMIRuntime.Tags("db240itrigger").Read db241trigger=HMIRuntime.Tags("DB241itrigger").Read Dim ss,str str=HMIRuntime.Tags("DB240szcoil_ID").Read ss=CStr(str) If (db240trigger=1 And db241trigger=0 ) Then Dim sPro,sDsn,sSer,sCon,sSql Dim oRsMaterial,conn,oCom,oItem,oRsSCHEMA Dim database,server,uid,pwd sCon ="driver=sql server;server=10.51.103.96;DATABASE=brgs_release;uid=sa;pwd=pasword" Set conn = CreateObject("ADODB.Connection") conn.ConnectionString = sCon conn.Open Set oRsMaterial = CreateObject("ADODB.Recordset") sSql= "SELECT * FROM dbo.BRGS_GP_Material where MkNo='" & CStr(ss) & "'" oRsMaterial.open ssql,conn,1,1 Dim m,n m=oRsMaterial.recordcount If m<>1 Then MsgBox "这个ID号找不到唯一的一条参数信息,请手动输入信息!" Exit Function End If Dim sCon2,sSql2

WINCC报警变量记录数据查询方法

按时间查询报警记录 用到控件为listView,textbox,progctrl,ImageComboCtrl Sub X6309X94AE1X0000X59CB_X6309X94AE1X0000X0000_X6309X94AE1X0000X005 8_X6309X94AE1X00009_OnClick(ByVal Item) Dim sPro Dim sDsn Dim sSer Dim sCon Dim sSql Dim oRs Dim conn Dim oCom Dim oItem Dim comItem Dim m, n, s Dim oList Dim T1,T2,T3,T4,T5,T6,record1,record2 Dim a,b Set oList = ScreenItems("ListView1") Set T1=ScreenItems("T1") Set T2=ScreenItems("T2") Set T6=ScreenItems("2") Set T3=ScreenItems("3")

Set T4=ScreenItems("4") Set T5=ScreenItems("pro") Set record1=ScreenItems("5") Set record2=ScreenItems("6") oList.View =3 oList.ListItems.Clear https://www.360docs.net/doc/376432523.html,boItems.Clear https://www.360docs.net/doc/376432523.html,boItems.Clear sPro = "Provider=WinCCOLEDBProvider.1;" sDsn = "Catalog=CC_HJ_07_08_19_17_28_13R;" sSer = "Data Source=.\WINCC" sCon = sPro + sDsn + sSer sSql = "ALARMVIEW:Select * FROM AlgViewCHT WHERE DateTime>'"+Trim(T1.Text)+"' AND DateTime<'"+Trim(T2.Text)+"'" Set conn = CreateObject("ADODB.Connection") conn.ConnectionString = sCon conn.CursorLocation = 3 conn.Open Set oRs = CreateObject("ADODB.Recordset") Set oCom = CreateObject("https://www.360docs.net/doc/376432523.html,mand")

VB操作wincc脚本心得

Vbs 操作wincc画面脚本总结 一:不使用变量单纯的操作界面 1.操作某个画面中控件的属性如Home1.Pdl(总窗体)下的画面窗口2(画面窗口) Sub OnClick(ByVal Item) Dim objCircle Dim screenname Dim pwname Set objCircle= ScreenItems("圆1" ) objCircle.Radius = 60 Set screenname=HMIRuntime.Screens("Home1") //获取要操作的窗体 Set pwname=screenname.ScreenItems("画面窗口2") //获取要操作的控件,这里填入你要操作的控件名 MsgBox(objCircle.Radius) //输出圆的半径 MsgBox (pwname.Picturename) //输出当前画面窗口2的名字 End Sub 注意当调用某窗体下的某控件的某个属性时,需要声明两个对象,一个接纳这个控件,一个接纳值例如 Dim object Dim value Set object =HMIRuntime.Screens("Home1").ScreenItems("画面窗口2") Set value=object.picturename 2.更改画面窗口的对象 Sub OnClick(Byval Item) Dim opObject Set opObject=HMIRuntime.Screens ("Home1").ScreenItems("画面窗口2") opObject.PictureName="Page1.Pdl" End Sub 3.设置文本 Set titleTxt=HMIRuntime.Screens ("Home1").ScreenItems("静态文本2") titleTxt.Text =titleTxt.Text+"EF" //获取文本的值并追加字符 4.vb 字符串函数 VB的字符串截取函数有Left(字符串,n),返回字符串前N个字符;Mid(字符串,p,n),从第p个字符开始,向后截取N个字符;right(字符串,n),返回字符串的最后n个字符。 获取下标

WinCC实现声音报警的方法

#include "apdefap.h" int gscAction( void ) { #pragma code("Winmm.dll") VOID WINAPI PlaySoundA(char* pszSound,char* hmode,DWORD dwFlag); #pragma code( ) if (GetTagByte("TI101")>100) {PlaySoundA("C:\\\\Program Files\\\\Windows NT\\\\Pinball\\\\SOUND36.WAV",NULL,1);} return 0; } 报警可以用以下两种实现方法: 1、建一个全局脚本,时基为2S #include "apdefap.h" int gscAction( void ) { #pragma code("Winmm.dll") VOID WINAPI PlaySoundA(char* pszSound,char* hmode,DWORD dwFlag); #pragma code( ) if (GetTagByte("TAG")==1) 或if (GetTagByte("TAG")>500) {PlaySoundA("d:\\ringout.wav",NULL,1);} return 0; } 用以上程序就可以实现单个变量报警,开关量为1或模似量大于500都可以报警,

用户可以根据自己的情况改变以上数值,如果有多个变量可以增加多个if . 2、通过报警记录,先在报警记录中组态好报警记录 建一个全局脚本,时基为2S #include "apdefap.h" int gscAction( void ) { MSG_RTDATA_STRUCT mRT; int i; char* pszToken; //Now is my code #pragma code("Winmm.dll") BOOL WINAPI sndPlaySoundA(char* szWave,DWORD dwFlag); #pragma code() DWORD SND_ASYNC=0x0001; DWORD SND_LOOP=0x0008; DWORD alarmsum,alarmunack; LPCMN_ERROR errorunack,errorsum; #pragma code("msrtcli.dll") #pragma code() LPDWORD lpdwServiceID; MSG_SERVICE_NOTIFY_PROC lpfnNotifyProc;

WinCCV7中如何能生成操作员地操作记录簿

WinCC V7中如何生成操作员的操作记录 1.操作员输入消息的分类 对于某些重要的对象和数据进行操作,根据需要可以在操作过程中触发操作员输入消息,操作员输入消息根据操作的对象和操作类型的不同,分为以下三类: a. “图形编辑器”中相应对象的属性中有“操作员输入消息”选项,例如:在 I/O 域中输入数值,文本列表中选择文本等。 对象属性功能支持的对象类型 操作员输入消息定义操作后是否输 出消息 I/O 域、文本列表、组合框、列表框、复选框、 单选框、滚动条 操作员激活报表定义是否记录操作 的原因 I/O 域、文本列表、组合框、列表框、滚动条 b. 对于操作可选图形 WinCC 对象,其属性中没有“操作员输入消息”选项,例如:对于按钮的操作等。 c. 在报警控件中对于消息的操作,例如确认锁定/释放消息等。 1.1如何限制用户对画面对象的操作 如上图中,通过按钮PIC1切换画面。如果需要限定某些操作员不能切换画面,就可以在按钮属性“其他”的“授权”中指定操作此对象所需要的权限。然后,在“用户管理器”中创建新用户,并分配相应权限即可。这样,如果没有用户登陆,或登陆用户没有按钮预先定义的授权,则无法操作按钮。

需要注意的是,在“用户管理器”中列出的1--17号权限的名称,仅是权限编号的别名而已,没有任何实际的功能。例如,画面中按钮1需要1号权限,按钮2需要2号权限…….按钮17需要17号权限;这样,只要用户管理器中的用户分配了相应的权限编号,如1、3、13号权限,那么这个用户只能操作1、3、13号按钮,其他按钮则无法操作。 在按钮的“事件”中插入以下脚本可以弹出用户登陆的对话框。 #pragma code("useadmin.dll") #include "pwrt_api.h" #pragma code() PWRTLogin('1'); //登陆C脚本 在按钮的“事件”中插入以下脚本可以注销当前登陆的用户。 #pragma code("useadmin.dll") #include "pwrt_api.h" #pragma code() PWRTLogout(); //注销C脚本 也可以在项目属性中,为用户登陆的对话框分配热键。 1.2 记录操作员登陆/注销的消息

【WinCC】使用VBS读取报警记录数据到EXCEL

【WinCC】使用VBS读取报警记录数据到EXCEL 1概述 介绍如何在WinCC项目中使用VBS脚本读取报警记录归档数据,并把获取的数据保存成新的Excel文件。 2软件环境 Windows XP SP3中文版、WinCC7.0 SP2 ASIA、Microsoft office Excel 2007 3访问原理 WinCC报警记录数据是以压缩的形式存储在数据库中,需要通过WinCC连通性软件包提供的OLE-DB接口才能够解压并读取这些数据。 当使用OLE-DB方式访问数据库时关键需要注意连接字符串的写法和查询语句的格式。连接字符串格式为“Provider=WinCCOLEDBProvider.1; Catalog= ***; Data Source= ***;”,其中:Catalog为WinCC运行数据库的名称,当修改项目名称或在其它计算机上打开原项目时, Catalog会发生变化。建议使用WinCC内部变量“@DatasourceNameRT”获得当前项目的Catalog。Data Source 为服务器名称,格式为“<计算机名称>\WinCC”。 3.1 查询语句格式 查询语句的格式要求如下: AlARMVIEW:SELECT * FROM [ WHERE……optional ] 其中参数信息如下所示: ViewName:数据库表名。必须用需要的语言指定该表。 比如:中文字符表名为:ALGVIEWCHT,英文字符表明为:ALGVIEWENU等。 Condition:为过滤标准。 详细说明请参见下表:

表1查询参数表 3.2查询结果 查询结果作为记录集返回。可以根据需要有选择的返回特定的数据集。例如:oRs.Fields(0).Value 返回的是消息的编号;oRs.Fields(2).Value 返回的是消息的时间戳;oRs.Fields(37).Value返回的是消息文本的内容。记录集的结构如下表所示:

wincc按钮通过脚本更改的方法

wincc按钮通过脚本更改的方法 最近才发现用脚本真的可以让画面更加高大上一点,本来想做个做个文档,但真的是做不出来就再下面总结一下用法把:拿提示文本举例吧,提示文本是把鼠标放到上面有相应的提示,我们可以 通过VB函数修改比如打我们这个设备达到允许条件然后这个文本提示允许,也可以控制它的颜色让按钮 更加明显(修改颜色我不知道为什么必须用VBGreen的方式而RGB(200,0,0)的方式不可以,所以有知道的顺便解答一下) ''按钮文本 ScreenItems("按钮1").Text="启动" ''按钮字体大小 ScreenItems("按钮1").FontSize=20 ''按钮字体样式 ScreenItems("按钮1").FontName="隶书" ''按钮粗体样式 ScreenItems("按钮1").FontBold=True ''按钮加下划线样式 ScreenItems("按钮1").FontUnderline=True ''按钮斜体样式

ScreenItems("按钮1").FontItalic=True ''按钮字体颜色 ScreenItems("按钮1").ForeColor=vbGreen ''按钮文本的字体 是否自适应大小 ScreenItems("按钮1").AdaptBorder=False ''按钮是否可见 ScreenItems("按钮1").Visible=True ''按钮的背景颜色 ScreenItems("按钮1").BackColor=vbYellow ''按钮背景的闪烁 ScreenItems("按钮1").backflashingenabled=False ''按钮的文本闪烁 ScreenItems("按钮1").FlashForeColor=False ''按钮的提示文本 ScreenItems("按钮1").ToolTipText="1#电机" ''按钮的填充图案(根据手册设置该值) ScreenItems("按钮1").FillStyle=131077 ''按钮操作权限(0不可以操作,1可以操作) ScreenItems("按钮1").enabled=False ''按钮的高 ScreenItems("按钮1").Height=150 ''按钮的宽

WinCC实例教程

WinCC 视频教程知识点总结 第一讲组态软件基础 一、WinCC简介 1、WinCC 西门子视窗控制中心SIMATIC WinCC(Windows Control Center)是在计算机上对PLC 控制的运行设备进行状态监控的软件,是PC上的监控软件。 运行该软件,可以动画监视现场设备的运行状况,监视相应的运行参数,以及更改、设置系统的运行数据。 2、WinCC的特点 (1)开放性 WinCC对用户所添加的任何形式的扩充是绝对开放,该绝对开放性是通过WinCC的模块结构及其强大的编程接口来获取的。 (2)将应用软件集成到WinCC中 WinCC提供了一些方法将其他应用程序和应用程序块统一地集成到用于过程控制的用户界面中。OLE应用程序窗口和OLE自定义控制或Active控制可以集成到WinCC应用软件中。 (3)WinCC中的数据管理 WinCC的数据库为Windows SQL,从属于WinCC,该数据库用于存储所有面向列表的组态数据(如变量列表和消息文本),以及当前过程数据(如消息,测量值和用户数据记录等)该数据库具有服务器功能。

(4)在项目开始之前规定组态分类 a、文件夹名称 除一些特殊字符(例如\)之外,文件夹名称允许使用所有的字符。还允许使用数字0~9. b、变量名称 变量名称可以多于8个字符。但应尽量避免太长的名称。WinCC项目的变量名称必须是唯一的。如果变量名称还包含了其他信息,这对用户将非常有用。 c、画面名称 确定画面名称时应注意其长度的影响,太长的名称(文件名)不容易识别(列表框中的选择,脚本中的调用等)。根据经验表明,长度最好不超过28个字符,画面名称应遵守以下限制条件:①最大长度为255个字符;②不使用某些特殊字符(例如\);③画面名称中的字母不区分大小写。 二、WinCC软件的安装 1、安装S7-300/400PLC编程软件STEP7及PLCSIM; 2、安装数据库软件SQL Server 2000; 3、安装消息列队(软件操作); 4、安装WinCC(建议不选典型安装,选择全部安装)。 三、WinCC管理器 1、WinCC项目管理器的结构 WinCC项目管理器的用户界面由以下元素组成:标题栏、菜单栏、工具栏、状态栏、浏览窗口和数据窗口:

wincc常用C脚本..

.用户注销: #pragma code ("useadmin.dll") #include "PWRT_api.h" #pragma code() PWRTLogout(); 2.用户登录: #pragma code ("useadmin.dll") #include "PWRT_api.h" #pragma code() PWRTLogin('c'); 3.关闭项目并退出wincc: ExitWinCC (); 4.退出运行到wincc资源管理器: DeactivateRTProject (); 按钮变三种颜色 #include "apdefap.h" long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { #pragma option(mbcs) if(GetTagWord("TX/ZSH001")==1) return 0x0000ff00; else if(GetTagWord("TX/ZSL001")==1) return 0x000000ff; else return 0x00c0c0c0; } 一个调用按钮变色 #include "apdefap.h" long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { #pragma option(mbcs) if(GetTagWord("NewTag")==0) return 0x0000ff00; else return 0x00ffffff;

Wincc报警文本记录

报警记录 在Wincc中可以组态事件的报警,组态事件报警基本上可以分为两个步骤。 1.在报警编辑器中设置报警的各种类别,包括上限下限值触发的模拟量报警,还有通过消 息变量触发的报警例如:开关量的报警。 2.通过对报警控件的设置实现报警显示。在画面编辑器中插入报警记录控件,报警控件具 有很多的功能。包括报警显示,对报警的确认,报警的自动归档,报警的查询等等。 首先组态一个模拟量报警,并通过此实例来说明状态变量,确认变量的定义及用法。在下一个实例中说明消息变量的使用。 模拟量报警 新建个项目命名为alarmtext点击创建按扭 打开报警记录编辑器,我们可以看到报警记录的主画面,包括消息块,消息类别,组消息,

和归档组态。 首先组态报警。组态报警就是设置报警消息的一些内容,包括时间,日期。报警地点,报警消息,产生报警的当前值以及报警的类别!报警消息的时间,日期对应消息块中的系统块。报警地点,报警消息对应消息块的用户文本块。当前值对应过程值块。故障报警对应消息类别。所以我们开始建立组态。 一.添加系统快。在消息块的系统快点击右击添加/删除

添加系统快我们可以看到系统已将编号,日期,时间选中。我们还可以添加左侧的系统快。但我们只使用编号,日期,时间选项。点击确定按钮。 我们看到所选的系统快已经显示出来

二.添加用户文本块。用户文本块采用同样的方法添加所需的块。我们采取默认选择的错误点和消息文本. 点击确定订按钮。 为了能使报警信息显示更多内容修改消息文本和错误点的字符长度改为30.双击消息文本,错误点修改。

。 三.添加过程值块 将过程值块中的过程值1,过程值2,过程值3添加到右侧如图。

wincc中常用C脚本

查看文章 wincc常用C动作 2010-06-27 10:31 1.用户注销: #pragma code ("useadmin.dll") #include "PWRT_api.h" #pragma code() PWRTLogout(); 2.用户登录: #pragma code ("useadmin.dll") #include "PWRT_api.h" #pragma code() PWRTLogin('c'); 3.关闭项目并退出wincc: ExitWinCC (); 4.退出运行到wincc资源管理器: DeactivateRTProject (); 5.结束监控并关闭计算机(会弹出确认对话框) HWND hWnd = NULL;//Author:Smartsys int iRet; hWnd = FindWindow(NULL,"WinCC-运行系统 - "); iRet=MessageBox(hWnd,"结束监控并关闭计算机", "关闭操作站",MB_YESNO|MB_ICONWARNING|MB_APPLMODAL); if(iRet==IDYES) DMExitWinCCEx (DM_SDMODE_POWEROFF); 6.点击事件弹出对话框,通过点击弹出对话框的确定和取消按钮实现对变量的置位或取消: int r; r=MessageBox(NULL, "YES为开,NO为关", "确定开命令:", MB_YESNO |MB_SYSTEMMODAL); if (r==IDYES) SetTagBit("TAGNAME",TRUE); else SetTagBit("TAGNAME",FALSE); 7.开显示关显示:(要在内部变量中建立三个二进制变量COLSE_DISPLAY、DISPLAY_NO和DISPLAY_COMMENT) // Funktion: Bit in Doppelwort setzen; if (GetTagBitWait("COLSE_DISPLAY")==1 )

VB操作wincc脚本心得精选文档

V B操作w i n c c脚本心 得精选文档 TTMS system office room 【TTMS16H-TTMS2A-TTMS8Q8-

Vbs 操作wincc画面脚本总结 一:不使用变量单纯的操作界面 1.操作某个画面中控件的属性如 Home1.Pdl(总窗体)下的画面窗口2(画面窗口) Sub OnClick(ByVal Item) Dim objCircle Dim screenname Dim pwname Set objCircle= ScreenItems("圆1" ) objCircle.Radius = 60 Set screenname=HMIRuntime.Screens("Home1") //获取要操作的窗体 Set pwname=screenname.ScreenItems("画面窗口2") //获取要操作的控件,这里填入你要操作的控件名 MsgBox(objCircle.Radius) //输出圆的半径 MsgBox (pwname.Picturename) //输出当前画面窗口2的名字 End Sub 注意当调用某窗体下的某控件的某个属性时,需要声明两个对象,一个接纳这个控件,一个接纳值例如 Dim object Dim value Set object =HMIRuntime.Screens("Home1").ScreenItems("画面窗口2") Set value=object.picturename

2.更改画面窗口的对象 Sub OnClick(Byval Item) Dim opObject Set opObject=HMIRuntime.Screens ("Home1").ScreenItems("画面窗口2") opObject.PictureName="Page1.Pdl" End Sub 3.设置文本 Set titleTxt=HMIRuntime.Screens ("Home1").ScreenItems("静态文本2") titleTxt.Text =titleTxt.Text+"EF" //获取文本的值并追加字符 4.vb 字符串函数 VB的字符串截取函数有Left(字符串,n),返回字符串前N个字符; Mid(字符串,p,n),从第p个字符开始,向后截取N个字符;right(字符串,n),返回字符串的最后n个字符。 获取下标 VB中的InStr()函数与InStrRev()函数: 都是在主字符串当中搜寻寻找子字符串,返回找到的子字符串在主字符串中出现的位置; 不同在于; InStr()函数,从左开始向右寻找,InStrRev()函数,从右开始向左寻找。 截取 right 和left 获取长度 Len

WINCC脚本整理

切换按钮 001SetTagBit("TE_BOOL",!GetTagBit("TE_BOOL")); 002BOOL A A=GetTagBit("TE_BOOL"); if(A)SetTagBit("TE_BOOL",0); ElseSetTagBit("TE_BOOL",1); 003SetTagBit("TE_BOOL ",1-GetTagBit("TE_BOOL ")); I O域处的xx输入输出 在I/O域的输出值事件处的动作 Float F_TAG; F_TAG =GetTagFloat("TE_FLOAT"); return(F_TAG /100); WINCC运行画面最小化 HWND WinCCHwnd; WinCCHwnd=FindWindow("PDLRTisAliveAndWaitsForYou",NULL); CloseWindow(WinCCHwnd); WINDOWSxx提供的标准对话框 {BOOL bool1; HWND Hwnd; int iRet; Hwnd = FindWindow(NULL,"WinCC-运行系统- ");

if (!Hwnd) Hwnd = FindWindow(NULL,"WinCC-运行系统- "); if (!Hwnd) printf("\r\nGetWinCC Handle Failed!"); iRet=MessageBox(Hwnd,"确认合闸","确认对话框 ",MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEM MODAL); switch (iRet){case IDYES: printf("user do YES\r\n"); SetTagBit("TE_QUEST",1); break; case IDNO: printf("user do NO\r\n"); SetTagBit("TE_QUEST",0); break; case IDCANCEL: printf("user do CANCEL\r\n"); break;}} 本画框的功能是点击按钮的时候弹出windows询问对话框其中“确认合闸”为对话内容,对话框的名称为“确认对话框” 用户不同显示不同的按钮 你可以在用户管理器给每个用户不同的权限,使他们对按钮有不同的操作权,这是最简便的。但是如果一定要根据用户不同显示不同的按钮就要用C脚本了

WINCC中使用C脚本获得操作记录的方法(原创)

WINCC中使用C脚本获得操作记录的方法(原创)

目录 1应用范围 (4) 1.1详述 (4) 1.2适用的系统 (5) 2硬、软件配置 (5) 3解决方法 (5) 附件 附件文档号说明

1 应用范围 1.1 详述 在生产中,有很多时候需要记录操作员的操作,以便进行事故分析。WINCC本身提供了一些对象可以产生操作记录,但是在复杂的情况下是无法兼顾既获得操作记录又满足特殊操作的要求。这时,可以使用C脚本来获得操作记录。 目前,在WINCC中以下对象可以很方便地获得操作记录: ●任何对象,将Event\Direct Connection\Operator Input Message选中。 图1 通过DirectConnection获得操作记录的组态 ●Check Box对象和Option Group对象,将property\Operator Input Message属性选择为yes。 图2 Check Box对象和Option Group对象获得操作记录的组态

IO Field对象和Slider对象:将property\Operator Input Message属性选择为yes;或将property\Operator Activities Report属性选择为yes。Operator Input Message和Operator Activities Report的区别是后者可以输入操作理由,确认之后操作记录的Comment中可以查看到操作理由。 图3 IO Field对象和Slider对象获得操作记录的组态 以上方法可以快捷地实现获取操作记录的功能,但是在某些情况下,功能要求更复杂,通过以上方法并不能满足要求。比如:操作员操作一个启动按钮,要求系统能够记录操作员操作信息。在单步操作的情况下,通过Direct Connection能够很方便地实现这一功能。但是在两步操作的情况下,需要操作员先确认,在得到确认之后操作才能生效,由于Direct Connection并没有提供操作确认功能,显然通过Direct Connection并不能满足要求。在这一的情况下,可以考虑采用C脚本来实现这一功能,通过MessageBox()函数来完成操作确认的功能,然后通过特别的函数来使系统产生操作记录。 1.2 适用的系统 该方法适用于安装有WINCC的系统中。 2 硬、软件配置 安装有WINCC软件,无版本限制。 3 解决方法 通过C脚本产生操作记录主要完成两部分组态工作,首先要在Alarm Logging中组态消息类型和定制消息内容;然后编写C脚本来产生操作记录。 第一步:在Alarm Logging中组态消息类型和定制消息内容。 1.新建消息并定义消息类型。系统产生的消息(包括了操作记录)和定制的消息都存储在Alarm Logging中,编号从1000000开始的消息为系统使用的消息,不能组态。如果需要定制消息,可 以使用1~1000000之间的消息号。在WINCC explorer中打开Alarm Logging,新建一条消息,

相关文档
最新文档