当前位置: 主页 > PLC控制

串口与wincc通讯

我要做用wincc读取一个智能仪表读数,智能仪表支持R232串口通讯,日本的仪表,厂家没有相关的读取读数的程序,需要我自己写一个。哪个老师有相关wincc与串口通讯的案例,给我发一个具体的代码(网上找到的都是不完整的代码),让我参考一下,谢谢了!

问题补充:
objMSComm1.Settings="9600,N,8,1"

最佳答案

需要知道仪表的通讯端口设置参数,在WINCC里要编写VBA脚本程序。
这里有一段程序,你可以参考下:高精度电压表(24bit)
PublicSubComPoRTOpen()”开串口
WithMSComm1
.CommPort=PortValue”使用COM1
.Settings="9600,N,8,1"”设置通信口参数
.InBufferSize=40
”设置MSComm1接收缓冲区为40字节
”.OutBufferSize=2
”设置MSComm1发送缓冲区为2字节
.InputMode=comInputModeBinary
”设置接收数据模式为二进制形式
.InputLen=1
”设置Input一次从接收缓冲读取字节数为1
”.SThreshold=1
”设置OuTPut一次从发送缓冲读取字节数为1
.InBufferCount=0”清除接收缓冲区
”.OutBufferCount=0”清除发送缓冲区
”MaxW=-99
”最大值赋初值
”MinW=99”最小值赋初值
”w=0
”数据个数计数器清零
.RThreshold=1
OnErrorResumeNext
”设置接收一个字节产生OnComm事件
If.PortOpen=FalseThen
”判断通信口是否打开
.PortOpen=True”打开通信口
IfErrThen”错误处理
msg=MsgBox("串口COM"&PortValue&"无效!",vbOKOnly,"警告")
ExitSub
EndIf
EndIf
EndWith
”MsgBox"端口已打开"
EndSub
PublicSubComPortClose()”关串口
MSComm1.PortOpen=False
”MsgBox"端口已关闭"
EndSub
PrivateSubMSComm1_OnComm()
Callrecive
EndSub
PrivateSubOption1_Click(IndexASInteger)
IfMSComm1.PortOpen=TrueThen
CallComPortClose
EndIf
PortValue=Index+1
CallComPortOpen
EndSub
PrivateSubrecive()”检测起始位并接收数据
DimBufferAsVariant
DimArr()AsByte
DiminData(5)AsByte
DimcountAsInteger
DimtempAsByte
”MsgBox"OnComm"
WithMSComm1
SelectCase.CommEvent
”判断MSComm1通信事件
CasecomEvReceive
”收到Rthreshold个字节产生的接收事件
Buffer=.Input
Arr=Buffer

”读取一个接收字节
”Text1.Text=Arr(0)
IfArr(0)=&H1BThen
.RThreshold=0
Do
DoEvents
LoopUntil.InBufferCount>=4

Fori=1To4
”count=.InBufferCount
Buffer=.Input
Arr=Buffer
inData(i)=Arr(0)
Nexti
IfinData(4)=&HAThen
If(inData(1)Mod64)>=32Then
.RThreshold=1
ExitSub
EndIf
valueFlag=1
”0.000003814697265625
temp=inData(1)Mod16
Iftemp<=7Then
value=inData(1)Mod8
value=value*256*256
value=value+Val(inData(2))*256
value=value+Val(inData(3))
value=value*3.814697265625E-06
”Text1.Text=Format(value,"0.000,000")
Else
value=inData(1)Mod8
value=value*256*256
value=value+Val(inData(2))*256
value=value+Val(inData(3))
value=value*3.814697265625E-06
value=0–value
EndIf
temp=inData(1)Mod128
”testOF
Iftemp>=64Then
Ifvalue<0Then
value=value–0.000004
Else
value=value+0.000004
EndIf
EndIf
”检测自动刷新
IfCheck1.valueThen
”valueFlag=1
Calldisplay
EndIf
Else
.RThreshold=1
ExitSub
EndIf
.InBufferCount=0
.RThreshold=1
EndIf
CaseElse
EndSelect
EndWith
”Text1.Text=Text1.Text+1
EndSub
PrivateSubOption2_Click(IndexAsInteger)
func=Index+1
EndSub
PublicSubdisplay()”判断功能并显示

”功能选择
SelectCasefunc
Case1”当前值
value2=value

Case2”平均值
IfnumCount>100000Then
numCount=1
valueSum=0
EndIf
IfvalueFlag=1Then
valueSum=valueSum+value
value2=valueSum/numCount
numCount=numCount+1
valueFlag=0
Label6.Caption=Str(numCount–1)
EndIf
Case3”最大值
Ifvalue>value2Then
value2=value
EndIf
Case4”最小值
Ifvalue<value2Then
value2=value
EndIf
CaseElse
EndSelect
”Text1.Text=Str(valueSum)
Label1.Caption=Format(value2,"0.000,000")
EndSub

提问者对于答案的评价:
谢谢了,参考一下

  • 关注微信

猜你喜欢

微信公众号