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

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

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    操作状态信息

示例程序界面:

下载地址: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
相关文章
|
SQL 数据可视化 Java
DBeaver数据库可视化工具
DBeaver数据库可视化工具
846 3
|
安全 Android开发
夜神模拟器 安卓7.0 burp抓包 https流量
夜神模拟器 安卓7.0 burp抓包 https流量
1129 0
|
定位技术
GIS空间分析 缓冲区分析与叠加分析1 选址分析(市区择房)
GIS空间分析 缓冲区分析与叠加分析1 市区择房,讲述如何利用缓冲区分析和叠加分析的方法进行选址分析
597 0
|
存储 负载均衡 容灾
MySQL数据库的分布式架构和数据分片方案
MySQL数据库的分布式架构和数据分片方案
|
7月前
|
Java 数据库连接 微服务
若依微服务的Mybatis-plus集成过程:一份详细的入门教程。
以上就是Spring Boot项目中集成MyBatis Plus的详细步骤。集成成功后,你就可以使用Mybatis-plus提供的强大功能,让你的增删改查操作更为简单。以上步骤简单易懂,非常适合初学者使用。希望对您有所帮助。
853 20
|
监控 测试技术 项目管理
鸿蒙原生开发环境的创新与性能优化:从工具到跨平台支持的全方位提升
鸿蒙原生开发环境不断创新与优化,涵盖实时预览、智能代码提示、多设备调试等创新功能,显著提升开发效率和跨平台支持。通过性能优化、用户界面改进、插件支持及详细的错误提示优化,进一步增强用户体验。此外,工具还强化了团队协作、性能监控、自动化测试及社区建设,助力开发者高效工作,推动鸿蒙生态繁荣发展。
751 18
鸿蒙原生开发环境的创新与性能优化:从工具到跨平台支持的全方位提升
|
数据挖掘
置信区间与预测区间:数据科学中的不确定性量化技术深度解读
本文深入探讨了统计学中两个常见但容易混淆的不确定性量化工具:置信区间和预测区间。
1242 1
置信区间与预测区间:数据科学中的不确定性量化技术深度解读
【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现(一)
【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
167 1
|
域名解析 负载均衡 网络协议
【域名解析DNS专栏】DNS解析中的Anycast技术:原理与优势
在互联网中,DNS将域名转换为IP地址至关重要。Anycast技术通过将同一IP地址分配给多台地理上分散的服务器,确保客户端总能连接到最近且最轻载的服务器,从而加速DNS解析、实现负载均衡、提升抵御DDoS攻击的能力及服务高可用性。通过动态路由协议如BGP实现,Anycast极大地增强了DNS系统的性能和稳定性。
917 2