|
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
|