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