感悟网 导航

关于VB和西门子PLC的通讯 怎样才能让VB和PLC相互通讯传输数据??

作者&投稿:咎泄 (若有异议请与网页底部的电邮联系)
能不能用串行通信把VB和西门子PLC连接起来~

可以
VB上写个串行通信
西门子PLC上也做个通信,就可以了

一般PLC厂家都有高级语言解决方案的啊,比如西门子的是 WinTcpS7 的DLL程序集,三菱的是EntQsPlc、EntFxPlc等,欧姆龙的是FinsTcp,FinsCom等,网上都有相关资源及介绍;

1.设置OPC SERVER,手册可以去西门子(中国)下载,配置IE模块,设置连接到该PLC的IP地址,这些手册都有的,文档名叫A030.PDF
2.在VB工程中引用sopcdaauto.dll或者通用的opcdaauto.dll,这些可以安装组态软件或者西门子系列软件得到
3.完成2后,就可以直接声明OPC SERVER以及OPC GROUP还有OPC ITEMS了
Public WithEvents ServerObj As OPCServer
Public WithEvents GroupObj As OPCGroup
Dim ItemObj1 As OPCItem
添加该标签
Set ItemObj1 = GroupObj.OPCItems.AddItem("S7:[S7 connection_1]Q0.0", 1)
4.设置读取数据,添加按钮,在其中输入代码
Dim OutText As String
Dim myValue As Variant
Dim myQuality As Variant
Dim myTimeStamp As Variant
Dim ClientID As Long
Dim ServerID As Long
Dim ErrorNr() As Long
Dim ErrorString As String

On Error GoTo ErrorHandler
OutText = "Reading Value of Item"

ClientID = READASYNC_ID
GroupObj.AsyncRead 1, Serverhandle, ErrorNr, ClientID, ServerID
If ErrorNr(1) <> 0 Then
ErrorString = ServerObj.GetErrorString(ErrorNr(1))
MsgBox ErrorString, vbCritical, "Error AsyncRead()"
End If

Erase ErrorNr
Exit Sub

ErrorHandler:
MsgBox Err.Description + Chr(13) + _
OutText, vbCritical, "ERROR"

这样就可以取数了

还是不明白的话,去我QQ空间,有篇文章写的很详细QQ:56229986

提供一个完整的VB6的代码:

Option Explicit

Dim PLC As New WinS7_PPI.PlcCom
Dim Linked As Boolean

Private Sub Form_Load()
  Dim i As Integer
  Me.Top = Screen.Height / 2 - Me.Height / 2
  Me.Left = Screen.Width / 2 - Me.Width / 2
  '
  cmbRdMemory.Clear
  cmbRdMemory.AddItem "I"
  cmbRdMemory.AddItem "Q"
  cmbRdMemory.AddItem "M"
  cmbRdMemory.AddItem "V"
  cmbRdMemory.ListIndex = 2
  cmbWtMemory.Clear
  cmbWtMemory.AddItem "I"
  cmbWtMemory.AddItem "Q"
  cmbWtMemory.AddItem "M"
  cmbWtMemory.AddItem "V"
  cmbWtMemory.ListIndex = 2
  '
  cmbRdDataType.Clear
  cmbRdDataType.AddItem "W_INT16"
  cmbRdDataType.AddItem "W_UINT16"
  cmbRdDataType.AddItem "D_DINT32"
  cmbRdDataType.AddItem "D_HEX32"
  cmbRdDataType.AddItem "D_REAL32"
  cmbRdDataType.AddItem "W_BIN16"
  cmbRdDataType.AddItem "B_CHAR8"
  cmbRdDataType.AddItem "B_BYTE8"
  cmbRdDataType.ListIndex = 0
  cmbWtDataType.Clear
  cmbWtDataType.AddItem "W_INT16"
  cmbWtDataType.AddItem "W_UINT16"
  cmbWtDataType.AddItem "D_DINT32"
  cmbWtDataType.AddItem "D_HEX32"
  cmbWtDataType.AddItem "D_REAL32"
  cmbWtDataType.AddItem "W_BIN16"
  cmbWtDataType.AddItem "B_CHAR8"
  cmbWtDataType.AddItem "B_BYTE8"
  cmbWtDataType.ListIndex = 0
  '
  cmbBitMemory.Clear
  cmbBitMemory.AddItem "I"
  cmbBitMemory.AddItem "Q"
  cmbBitMemory.AddItem "M"
  cmbBitMemory.AddItem "V"
  cmbBitMemory.ListIndex = 2
  
  For i = 0 To 7 Step 1
    cmbBitNum.AddItem i
  Next i
  cmbBitNum.ListIndex = 0
    
End Sub


Private Sub Online_Click()
  Dim re As Integer
  Dim port As Integer
  port = Val(txtPort.Text)
  re = PLC.ComLink(port, 9600, Val(txtNode.Text), "DEMO")
  txtState.Text = re
  Linked = CBool(re = 0)
End Sub


Private Sub Offline_Click()
  Dim re As Integer
  re = PLC.DeLink()
  txtState.Text = re
  Linked = False
End Sub

Private Sub R_CIO_Click()
  Dim i As Integer
  Dim Node As Integer
  Dim Memory As PlcMemory
  Dim dtype As DataType
  Dim add As Integer
  Dim Count As Integer
  Dim rd() As String
  Dim re As Integer
  Dim tstr As String
  
  If Not Linked Then Exit Sub
  Node = Val(txtNode.Text)
  Select Case cmbRdMemory.ListIndex
      Case 0: Memory = PlcMemory.DI
      Case 1: Memory = PlcMemory.DQ
      Case 2: Memory = PlcMemory.MR
      Case 3: Memory = PlcMemory.DR
  End Select
  Select Case cmbRdDataType.ListIndex
      Case 0: dtype = DataType.tINT16
      Case 1: dtype = DataType.tUINT16
      Case 2: dtype = DataType.tDINT32
      Case 3: dtype = DataType.tHEX32
      Case 4: dtype = DataType.tREAL32
      Case 5: dtype = DataType.tBIN16
      Case 6: dtype = DataType.tCHAR8
      Case 7: dtype = DataType.tBYTE8
  End Select
  add = Val(txtRdAddress.Text)
  Count = Val(txtRdCount.Text)
  re = PLC.CmdRead(Node, Memory, dtype, add, Count, rd())
  txtRdState.Text = re
  tstr = ""
  If re = 0 Then
    For i = 0 To UBound(rd)
     tstr = tstr & rd(i) & vbCrLf
    Next i
  End If
  txtRead.Text = tstr
End Sub



Private Sub W_CIO_Click()
  Dim i As Integer
  Dim Node As Integer
  Dim Memory As PlcMemory
  Dim dtype As DataType
  Dim add As Integer
  Dim Count As Integer
  Dim wt() As String
  Dim re As Integer
  Dim tstr() As String
  '
  If Not Linked Then Exit Sub
  Node = Val(txtNode.Text)
  Select Case cmbWtMemory.ListIndex
      Case 0: Memory = PlcMemory.DI
      Case 1: Memory = PlcMemory.DQ
      Case 2: Memory = PlcMemory.MR
      Case 3: Memory = PlcMemory.DR
  End Select
  Select Case cmbWtDataType.ListIndex
      Case 0: dtype = DataType.tINT16
      Case 1: dtype = DataType.tUINT16
      Case 2: dtype = DataType.tDINT32
      Case 3: dtype = DataType.tHEX32
      Case 4: dtype = DataType.tREAL32
      Case 5: dtype = DataType.tBIN16
      Case 6: dtype = DataType.tCHAR8
      Case 7: dtype = DataType.tBYTE8
  End Select
  add = Val(txtWtAddress.Text)
  Count = Val(txtWtCount.Text)
  ReDim wt(Count - 1) As String
  tstr = Split(Trim(txtWrite.Text), vbCrLf)
  For i = 0 To UBound(wt)
     wt(i) = Trim(tstr(i))
  Next i
  re = PLC.CmdWrite(Node, Memory, dtype, add, Count, wt())
  txtWtState.Text = re
End Sub




Private Sub T_BIT_Click()
  Dim Node As Integer
  Dim Memory As PlcMemory
  Dim add As Integer
  Dim bitnum As Integer
  Dim re As Integer
  Dim tb As Boolean
  '
  If Not Linked Then Exit Sub
  Node = Val(txtNode.Text)
  Select Case cmbBitMemory.ListIndex
      Case 0: Memory = PlcMemory.DI
      Case 1: Memory = PlcMemory.DQ
      Case 2: Memory = PlcMemory.MR
      Case 3: Memory = PlcMemory.DR
  End Select
  add = Val(txtBitAddress.Text)
  bitnum = cmbBitNum.ListIndex
  re = PLC.Bit_Test(Node, Memory, add, bitnum, tb)
  txtBitState.Text = re
  txtReBit.Text = IIf(tb, "ON", "OFF")
  Linked = CBool(re = 0)
End Sub


Private Sub S_BIT_Click()
  Dim Node As Integer
  Dim Memory As PlcMemory
  Dim add As Integer
  Dim bitnum As Integer
  Dim re As Integer
  Dim tb As Boolean
  '
  If Not Linked Then Exit Sub
  Node = Val(txtNode.Text)
  Select Case cmbBitMemory.ListIndex
      Case 0: Memory = PlcMemory.DI
      Case 1: Memory = PlcMemory.DQ
      Case 2: Memory = PlcMemory.MR
      Case 3: Memory = PlcMemory.DR
  End Select
  add = Val(txtBitAddress.Text)
  bitnum = cmbBitNum.ListIndex
  re = PLC.Bit_Set(Node, Memory, add, bitnum)
  txtBitState.Text = re
  Linked = CBool(re = 0)
End Sub

Private Sub R_BIT_Click()
  Dim Node As Integer
  Dim Memory As PlcMemory
  Dim add As Integer
  Dim bitnum As Integer
  Dim re As Integer
  Dim tb As Boolean
  If Not Linked Then Exit Sub
  Node = Val(txtNode.Text)
  Select Case cmbBitMemory.ListIndex
      Case 0: Memory = PlcMemory.DI
      Case 1: Memory = PlcMemory.DQ
      Case 2: Memory = PlcMemory.MR
      Case 3: Memory = PlcMemory.DR
  End Select
  add = Val(txtBitAddress.Text)
  bitnum = cmbBitNum.ListIndex
  re = PLC.Bit_Reset(Node, Memory, add, bitnum)
  txtBitState.Text = re
  Linked = CBool(re = 0)
End Sub


使用S7-200,但是数据交换量不是很大,用WINCC感觉比较浪费,所以就自己做个监控软件,就想到了用VB编写程序,来调用w95_s7.dll动态链接数据库。
1.Prodave 是用于pc 与s7 系列plc 之间的数据链接通信的工具箱。其实质就是用户通过调用“w95_s7.dll”等库函数来解决 PLC 与PC之间的数据交换和数据处理问题。 所需硬件为:CPU22x,PC/PPI编程电缆,带COM口的PC。这可能是最简单的配置,很容易实现试验的目的。这里不需要安装Prodave软件,只要把“w95_s7.dll”文件拷贝到您程序相应的目录中去即可。2.通讯设置:打开“控制面板”中“设置PG/PC接口”选项,在“应用程序访问点”列表框内选择“S7ONLINE (STEP7) PC/PPI Cable”,在其属性内的“超时”可以设置大点,这里设置为100ms,“波特率”设置为9.6kbps(因为我的pc/ppi电缆为国产的,不支持多主站),“地址”为0。3。源代码:①PLC程序:LD I0.0 MOVW 4766, VW0 ②VB程序:

****在模块中声明****:

Public plcadr As plcadrtype

Public gb_PlcConnected As Boolean

Type plcadrtype

adr As Byte ‘站地址,默认值为2

SEGMENTID As Byte ‘段标识符,固定值为0

SLOTNO As Byte ‘槽的编号,默认值为2

RACKNO As Byte ‘机架号,固定为0

End Type

Public Res As Long

Declare Function load_tool Lib "w95_s7.dll" (ByVal nr As Byte, ByVal dev As String, adr As plcadrtype) As Long

。。。。。。。 ‘省略其它定义函数。

Declare Function as200_vs_field_read Lib "w95_s7.dll" (ByVal nr As Long, ByVal anz As Long, value As Byte) As Long ‘读200PLC V存储区的数据函数

****在窗体中声明****

Private Sub Form_Load()

Dim buffer(1) As Byte

plcadr.adr = 2

plcadr.SEGMENTID = 0

plcadr.SLOTNO = 2

plcadr.RACKNO = 0

Res = load_tool(1, "S7ONLINE", plcadr)

Res = as200_vs_field_read(0, 2, buffer(0))

If Res <> 0 Then

MsgBox ("PLC连接错误")

gb_PlcConnected = False

Else

gb_PlcConnected = True

MsgBox ("plc连接正确")

Label1.Caption = buffer(0) * 256 + buffer(1)

End If

End Sub

通过以上程序可以正确读出PLC中的数据。之后可以扩展内容,编写一个监控软件。
相关源码把邮箱给 我 ,发到你邮箱,我的邮箱:acion@163.com

《怎样才能让VB和PLC相互通讯传输数据??》
答:1.用PRODAVE软件包实现通信连接PRODAVE是西门子公司推出的专门用于西门子PLC产品(S7?200、300、400系列PLC)与P/PG进行数据交换处理的软件包。PRODAVE在.DLL或.LIB文件中集成了数据交换的函数,在自行开发的监控软件中可以方便地调用该软件中的各种函数,主要有:load_tool,PC机与PLC系统初始化链接;unloa...

《关于VB和西门子PLC的通讯》
答:1.设置OPC SERVER,手册可以去西门子(中国)下载,配置IE模块,设置连接到该PLC的IP地址,这些手册都有的,文档名叫A030.PDF 2.在VB工程中引用sopcdaauto.dll或者通用的opcdaauto.dll,这些可以安装组态软件或者西门子系列软件得到 3.完成2后,就可以直接声明OPC SERVER以及OPC GROUP还有OPC ITEMS了 Pu...

《vb和西门子s7-200 plc的通讯 监控》
答:西门子的Step 7 Micro/Win32 是用于S7-200系列PLC的开发工具,它使用PC机上的COM口通过一条PC/PPI编程电缆连到PLC的编程口上。这说明,PC实际上是可以通过串口同S7-200 CPU通讯。只是我们不知道通讯协议而已。通过截获PC机串口上的收发数据,对照Step 7软件发出的指令,我们就有可能分析出有关指令的报...

《VB和S7-300PLC通讯》
答:用VB与S7-300的通讯方式有很多种:1、使用Prodave实现PPI MPI通讯 2、使用OPC,利用OPC提供的通用接口,实现OPC方式通讯 3、有CP341,可以进行自由口通讯,上位和PLC之间需要考虑协同

《vb如何和西门子plc衔接?》
答:设置plc通信端口为自动通信模式,然后用串口线连接plc到电脑的串口,注意plc端接线方式与普通串口不同,vb6使用mscomm控件进行通信。

《VB实现PLC与上位机通信》
答:下面以西门子PLC为例说下实现方法:一、通过STEP7软件建立一个新项目OPC,在项目中添加SIMATIC 300站和一个PC 站,其中PLC站中第四个槽安装的CP343模块。PC站的第一个槽 为OPC SERVER ,第三个槽为 IE GENERAL,然后在NETPRO下配置PLC和PC站的网络连接:(注意:是在PC站上新建的网络连接,连接类型...

《请教VB和PLC通讯的问题!!!》
答:1)首先需要 VB 的串行通信控件 MSCOM 控件 2)需要知道PLC的通信协议 3) 还要学一学有关串行通信方面的基础知识!4)给你推荐一本书《VB 串行通讯》

《vb如何和西门子plc衔接?》
答:vb不能直接访问plc的。西门子有专用的软件接口,是通过opc实现的。大致原理是架设好opc server(其实也是一个软件),通过opc协议把plc的所有需要的io或者中间变量共享出来,然后用西门子的专用接口访问opc上共享出来的这些内容(vb、vc、c#等)。另外如果你现在有wincc和plc通信且能监控或者控制plc的io点或者...

《寻求一个VB与西门子S7_200PLC的通讯程序》
答:rcv(2) Q0状态, rcv(3) Q1状态 <>255,'rcv(4) I0状态, rcv(5) I1状态, rcv(6) 校验, rcv(7) 结束 255,' Call dtob1 Call dtob2 For i = 0 To 7 If s1(i) = 1 Then Shape1(i).FillColor = vbRed Else Shape1(i).FillColor = vbBlue ...

《vb6.0通过TCP和西门子PLC通讯》
答:你要把数据写入PLC必须用OPC软件 电脑与PLC之间建立TCP通道可以用赛远公司的SY-RSCM300远程安全通讯模块,建立PC与PLC之间的通道,实现广域网的OPC

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网