西门子PPI协议的工控通信控件

    PPI协议是西门子PLC的私有协议,但是PPI又是西门子PLC200系列的默认的协议,如果用公开协议Modbus还得占用目前的程序空间和变量空间。这个控件开发已久,在工控现场已经稳定可靠的运行了几年,性能和可靠性都不错。可操作的变量类型有I、Q、M、V、S、SM。 提供有详细的示例程序,很容易掌握使用。

      同类软件还有Modbus.ocx,S7_CP243.ocx,S7_MPI.ocx等控件

【属性】

  bps            波特率
  DataBit        数据位
  StopBit        停止位
  CheckOut       校验方式
  FixAddr        PLC地址

【方法】

  OpenPort       打开串口
  ClosePort      关闭串口
  PlcLogin       PLC登录
  PlcRun         PLC运行
  PlcStop        PLC停止
  ReadData       读PLC数据
  WriteData      写PLC数据
  InitRegCompany 初始化注册公司名称

【事件】

  ErrorMessge    操作状态信息

 示例程序界面:

西门子PPI协议的工控通信控件_第1张图片

 下载地址:http://www.sky-walker.com.cn/YeFan/S7_ppi.rar

示例程序代码:

'*************************************************************************
'**模 块 名:frmTest
'**说    明:YFsoft 版权所有2005 - 2006(C)
'**创 建 人:叶帆
'**日    期:2005-08-23 14:45:36
'**修 改 人:
'**日    期:
'**描    述:PPIClient 控件示例(需连接西门子200PLC)
'**          非注册版本只能读取变量区的前10个地址,注册用户读写数据无限制,也无用户个数限制
'**          获取注册图片后,直接拷贝到控件的当前目录即可完成注册,注意在程序中添加下面一行代码:
'**          S7_PPI1.RegCompany="×××公司"  公司名称要和你注册提交的公司名称一致
'**          最新版本请关注:http://blog.csdn.net/yefanqiu
'**版    本:V1.0.0
'*************************************************************************

'*************************************************************************
'**函 数 名:chkRun_Click
'**输    入:无
'**输    出:无
'**功能描述:连续读取PLC数据
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-08-28 11:11:25
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub chkRun_Click()
   tmrRead.Enabled = IIf(chkRun.Value = 0, False, True)
End Sub

'*************************************************************************
'**函 数 名:cmdLogin_Click
'**输    入:无
'**输    出:无
'**功能描述:登录指定地址的PLC
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-07-26 20:39:33
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub cmdLogin_Click()
   If S7_PPI1.PlcLogin(cmbNo.ListIndex + 1) = 0 Then
      picFlag.BackColor = RGB(0, 255, 0)
      picOk.BackColor = RGB(0, 255, 0)
   Else
      picFlag.BackColor = RGB(255, 0, 0)
      picOk.BackColor = RGB(255, 0, 0)
   End If
End Sub
'*************************************************************************
'**函 数 名:cmdSendData_Click
'**输    入:无
'**输    出:无
'**功能描述:读PLC数据
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-08-27 23:59:32
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub cmdReadData_Click()
    On Error GoTo ToExit '打开错误陷阱
    '------------------------------------------------
   Dim i As Long
   Dim bytType As Byte
   Dim lngData() As Long
  
   Select Case cmbType.ListIndex
     Case 0: bytType = PPI_I
     Case 1: bytType = PPI_Q
     Case 2: bytType = PPI_M
     Case 3: bytType = PPI_V
     Case 4: bytType = PPI_S
     Case 5: bytType = PPI_SM
   End Select
  
   S7_PPI1.FixAddr = cmbNo.ListIndex + 1
   If S7_PPI1.ReadData(Val(txtAddr), lngData(), Val(cmbNum.Text), Val(cmbLen.ListIndex), Val(bytType)) = 0 Then
      txtData = ""
      For i = 1 To Val(cmbNum.Text)
        txtData = txtData & Format(lngData(i - 1), "0") & " "
      Next
   Else
     txtData = "Error"
   End If
    '------------------------------------------------
    Exit Sub
    '----------------
ToExit:
   MsgBox Err.Description
End Sub

'*************************************************************************
'**函 数 名:cmdRun_Click
'**输    入:无
'**输    出:无
'**功能描述:使PLC运行
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-07-26 20:55:15
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub cmdRun_Click()
    Dim lngRet As Long
    lngRet = S7_PPI1.PlcRun(cmbNo.ListIndex + 1)
    If lngRet = 0 Then
        picFlag.BackColor = RGB(0, 255, 0)
        picOk.BackColor = RGB(0, 255, 0)
    Else
        picOk.BackColor = RGB(255, 0, 0)
    End If
    If lngRet = 4 Then
        MsgBox "PLC拨码开关在停止位置"
    End If
End Sub

'*************************************************************************
'**函 数 名:cmdStop_Click
'**输    入:无
'**输    出:无
'**功能描述:停止PLC运行
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-07-26 21:03:23
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub cmdStop_Click()
    If S7_PPI1.PlcStop(cmbNo.ListIndex + 1) = 0 Then
        picFlag.BackColor = RGB(255, 255, 0)
        picOk.BackColor = RGB(0, 255, 0)
    Else
        picOk.BackColor = RGB(255, 0, 0)
    End If
End Sub
'*************************************************************************
'**函 数 名:cmdWriteData_Click
'**输    入:无
'**输    出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-08-28 11:43:08
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub cmdWriteData_Click()
    On Error GoTo ToExit '打开错误陷阱
    '------------------------------------------------
    Dim bytType As Byte
    Dim strData() As String
    Dim lngData() As Long
    Dim i As Long

    Select Case cmbType.ListIndex
      Case 0: bytType = PPI_I
      Case 1: bytType = PPI_Q
      Case 2: bytType = PPI_M
      Case 3: bytType = PPI_V
      Case 4: bytType = PPI_S
      Case 5: bytType = PPI_SM
    End Select

    If Len(txtData) > 0 Then
        strData = Split(txtData, " ")
        ReDim lngData(UBound(strData))
        For i = 0 To UBound(strData)
          lngData(i) = Val(strData(i))
        Next
        If S7_PPI1.WriteData(Val(txtAddr), lngData, UBound(strData) + 1, Val(cmbLen.ListIndex), Val(bytType), cmbNo.ListIndex + 1) = 0 Then
            '
        Else
            txtData = "Error"
        End If
    End If
    '------------------------------------------------
    Exit Sub
    '----------------
ToExit:
    MsgBox Err.Description
End Sub

'*************************************************************************
'**函 数 名:Form_Load
'**输    入:无
'**输    出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-08-28 19:07:04
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub Form_Load()
   Dim i As Long
   For i = 1 To 222
     cmbNo.AddItem Format(i, "0")
   Next
   For i = 1 To 100
     cmbNum.AddItem Format(i, "0")
   Next
   cmbNum.ListIndex = 0
   cmbNo.ListIndex = 0
   cmbType.ListIndex = 3
   cmbLen.ListIndex = 0
  
   S7_PPI1.InitRegCompany "×××公司"    '已注册的公司名称
   S7_PPI1.OpenPort 1                     '打开连接PLC的COM1接口
End Sub

'*************************************************************************
'**函 数 名:Form_Unload
'**输    入:Cancel(Integer) -
'**输    出:无
'**功能描述:关闭串口
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-08-23 14:40:05
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub Form_Unload(Cancel As Integer)
   S7_PPI1.ClosePort
   End
End Sub

'*************************************************************************
'**函 数 名:S7_PPI1_ErrorMessge
'**输    入:msgNo(Integer)         - 信息号
'**        :msgDescription(String) - 信息内容
'**输    出:无
'**功能描述:控件的事件
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-11-18 11:06:48
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub S7_PPI1_ErrorMessge(msgNo As Integer, msgDescription As String)
    MsgBox Str(msgNo) & " - " & msgDescription
End Sub

'*************************************************************************
'**函 数 名:tmrRead_Timer
'**输    入:无
'**输    出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2005-08-28 11:10:58
'**修 改 人:
'**日    期:
'**版    本:V1.0.0
'*************************************************************************
Private Sub tmrRead_Timer()
   cmdReadData_Click
End Sub

 

你可能感兴趣的:(c,timer,String,Integer,byte)